diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java index 43ddc1cb5..cb6a88f30 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java @@ -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 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 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 getList() { + public List getList() { return list == null ? Collections.emptyList() : list; } - public void setList(List list) { + public void setList(List 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; - } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java b/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java new file mode 100644 index 000000000..c34944690 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/EpgData.java @@ -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; + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index f5292c755..a6fabfbac 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -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 mObserveUrl; private CustomKeyDownLive mKeyDown; private GroupAdapter mGroupAdapter; private Observer mObserveEpg; private LiveViewModel mViewModel; - private EpgAdapter mEpgAdapter; private List 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()) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgDataAdapter.java similarity index 70% rename from app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgAdapter.java rename to app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgDataAdapter.java index d7a255f31..ba35b3fdd 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgDataAdapter.java @@ -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 { +public class EpgDataAdapter extends RecyclerView.Adapter { private final OnClickListener mListener; - private final List mItems; + private final List 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 { notifyDataSetChanged(); } - public void addAll(List items) { + public void addAll(List items) { mItems.clear(); mItems.addAll(items); notifyDataSetChanged(); @@ -51,12 +52,12 @@ public class EpgAdapter extends RecyclerView.Adapter { @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 { 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; } diff --git a/app/src/mobile/res/drawable/ic_action_arrow.xml b/app/src/mobile/res/drawable/ic_action_arrow.xml new file mode 100644 index 000000000..f407edd0e --- /dev/null +++ b/app/src/mobile/res/drawable/ic_action_arrow.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/mobile/res/layout/activity_live.xml b/app/src/mobile/res/layout/activity_live.xml index f717ea525..fa3beddd4 100644 --- a/app/src/mobile/res/layout/activity_live.xml +++ b/app/src/mobile/res/layout/activity_live.xml @@ -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"> + + diff --git a/app/src/mobile/res/layout/adapter_epg.xml b/app/src/mobile/res/layout/adapter_epg_data.xml similarity index 87% rename from app/src/mobile/res/layout/adapter_epg.xml rename to app/src/mobile/res/layout/adapter_epg_data.xml index da2745d16..74f798e97 100644 --- a/app/src/mobile/res/layout/adapter_epg.xml +++ b/app/src/mobile/res/layout/adapter_epg_data.xml @@ -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"> - + tools:visibility="visible"> + + + +