From 428116ff4be4ac2f9862725cc1ce8cc90e8c8372 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 22 Oct 2022 01:24:10 +0800 Subject: [PATCH] support live - part 5 --- .../android/tv/ui/activity/LiveActivity.java | 34 ++++--- app/src/leanback/res/layout/activity_live.xml | 2 +- .../com/fongmi/android/tv/api/ApiConfig.java | 7 +- .../com/fongmi/android/tv/api/LiveConfig.java | 45 +++++++-- .../java/com/fongmi/android/tv/bean/Live.java | 91 ++++++++++++++++++- .../com/fongmi/android/tv/utils/Prefers.java | 8 ++ 6 files changed, 155 insertions(+), 32 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 028e75931..ef08ee7fe 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -55,6 +55,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick return (Channel) mChannelAdapter.get(mBinding.channel.getSelectedPosition()); } + private boolean isRecyclerVisible() { + return mBinding.recycler.getVisibility() == View.VISIBLE; + } + @Override protected ViewBinding getBinding() { return mBinding = ActivityLiveBinding.inflate(getLayoutInflater()); @@ -78,12 +82,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick onItemClick((Group) mGroupAdapter.get(position)); } }); - mBinding.channel.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { - @Override - public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) { - onItemClick((Channel) mChannelAdapter.get(position)); - } - }); } private void setRecyclerView() { @@ -92,7 +90,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void getLive() { - mGroupAdapter.setItems(LiveConfig.get().getLives().get(0).getGroups(), null); + mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null); + mBinding.channel.requestFocus(); } private void setVideoView() { @@ -131,22 +130,31 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick break; default: if (!event.isRetry() || mPlayers.addRetry() > 1) onError(); - //else mPlayers.start(mChannelAdapter.getCurrent()); + else mPlayers.start(getChannel()); break; } } private void onError() { - /*int index = mChannelAdapter.getCurrent().getIndex() + 1; - int size = mChannelAdapter.getCurrent().getUrls().size(); + int index = getChannel().getIndex() + 1; + int size = getChannel().getUrls().size(); mPlayers.setRetry(0); if (index == size) { //TODO Auto Next mBinding.progress.getRoot().setVisibility(View.GONE); } else { - mChannelAdapter.getCurrent().setIndex(index); - mPlayers.start(mChannelAdapter.getCurrent()); - }*/ + getChannel().setIndex(index); + mPlayers.start(getChannel()); + } + } + + @Override + public void onBackPressed() { + if (isRecyclerVisible()) { + mBinding.recycler.setVisibility(View.GONE); + } else { + super.onBackPressed(); + } } @Override diff --git a/app/src/leanback/res/layout/activity_live.xml b/app/src/leanback/res/layout/activity_live.xml index ec603f81b..2bd097790 100644 --- a/app/src/leanback/res/layout/activity_live.xml +++ b/app/src/leanback/res/layout/activity_live.xml @@ -37,7 +37,7 @@ diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index 69c92a159..e8e12c620 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -5,8 +5,8 @@ import android.os.Looper; import android.text.TextUtils; import com.fongmi.android.tv.R; -import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Config; +import com.fongmi.android.tv.bean.Live; import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.net.Callback; @@ -129,14 +129,13 @@ public class ApiConfig { if (!parses.contains(parse)) parses.add(parse); } for (JsonElement element : Json.safeListElement(object, "lives")) { - for (JsonElement channel : element.getAsJsonObject().get("channels").getAsJsonArray()) { - LiveConfig.get().parse(Channel.objectFrom(channel)); - } + LiveConfig.get().parse(Live.objectFrom(element)); } if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0)); flags.addAll(Json.safeListString(object, "flags")); ads.addAll(Json.safeListString(object, "ads")); + LiveConfig.get().setHome(); } private String parseExt(String ext) { diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java index 6c4478917..dcb356202 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java @@ -6,6 +6,8 @@ import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Live; import com.fongmi.android.tv.net.OKHttp; +import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.Prefers; import java.util.ArrayList; import java.util.List; @@ -13,6 +15,7 @@ import java.util.List; public class LiveConfig { private List lives; + private Live home; private static class Loader { static volatile LiveConfig INSTANCE = new LiveConfig(); @@ -31,23 +34,45 @@ public class LiveConfig { return lives; } - public void parse(Channel item) { - if (lives == null) init(); - if (item.getUrls().isEmpty()) return; - if (!item.getUrls().get(0).startsWith("proxy://")) return; + public Live getHome() { + return home; + } + + public void setHome() { + if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0)); + } + + public void setHome(Live home) { + this.home = home; + this.home.setActivated(true); + Prefers.putLive(home.getName()); + for (Live item : lives) item.setActivated(home); + } + + private boolean isProxy(Live live) { + return live.getGroup().equals("redirect") && live.getChannels().size() > 0 && live.getChannels().get(0).getUrls().size() > 0 && live.getChannels().get(0).getUrls().get(0).startsWith("proxy"); + } + + public void parse(Live live) { try { - String base64 = item.getUrls().get(0).split("ext=")[1]; - String url = new String(Base64.decode(base64, Base64.DEFAULT)); - Live live = new Live(item.getName(), new ArrayList<>()); - parse(OKHttp.newCall(url).execute().body().string(), live); + if (lives == null) init(); + if (isProxy(live)) live = new Live(live.getChannels().get(0).getName(), live.getChannels().get(0).getUrl().split("ext=")[1]); + if (live.getType() == 0) parse(live, getTxt(live.getUrl())); if (live.getGroups().size() > 0) getLives().add(live); + if (live.getName().equals(Prefers.getLive())) setHome(live); } catch (Exception e) { e.printStackTrace(); } } - private void parse(String result, Live live) { - for (String line : result.split("\n")) { + private String getTxt(String url) throws Exception { + if (url.startsWith("http")) return OKHttp.newCall(url).execute().body().string(); + else if (url.startsWith("file")) return FileUtil.read(url); + else return getTxt(new String(Base64.decode(url, Base64.DEFAULT))); + } + + private void parse(Live live, String txt) { + for (String line : txt.split("\n")) { String[] split = line.split(","); if (split.length < 2) continue; if (line.contains("#genre#")) { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index 9e4c27be6..45a1947fa 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -1,26 +1,109 @@ package com.fongmi.android.tv.bean; +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; public class Live { + @SerializedName("type") + private int type; @SerializedName("name") private String name; + @SerializedName("group") + private String group; + @SerializedName("url") + private String url; + @SerializedName("logo") + private String logo; + @SerializedName("epg") + private String epg; + @SerializedName("ua") + private String ua; + @SerializedName("channels") + private List channels; @SerializedName("groups") private List groups; - public Live(String name, List groups) { + private boolean activated; + + public static Live objectFrom(JsonElement element) { + return new Gson().fromJson(element, Live.class); + } + + public static List arrayFrom(String str) { + Type listType = new TypeToken>() {}.getType(); + return new Gson().fromJson(str, listType); + } + + public Live() { + } + + public Live(String name, String url) { this.name = name; - this.groups = groups; + this.url = url; + } + + public int getType() { + return type; } public String getName() { - return name; + return TextUtils.isEmpty(name) ? "" : name; + } + + public String getGroup() { + return TextUtils.isEmpty(group) ? "" : group; + } + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url; + } + + public String getLogo() { + return TextUtils.isEmpty(logo) ? "" : logo; + } + + public String getEpg() { + return TextUtils.isEmpty(epg) ? "" : epg; + } + + public String getUa() { + return TextUtils.isEmpty(ua) ? "" : ua; + } + + public List getChannels() { + return channels = channels == null ? new ArrayList<>() : channels; } public List getGroups() { - return groups; + return groups = groups == null ? new ArrayList<>() : groups; + } + + public boolean isActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } + + public void setActivated(Live item) { + this.activated = item.equals(this); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Live)) return false; + Live it = (Live) obj; + return getName().equals(it.getName()); } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java index d315fa806..8108d515a 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java @@ -68,6 +68,14 @@ public class Prefers { put("home", home); } + public static String getLive() { + return getString("live"); + } + + public static void putLive(String live) { + put("live", live); + } + public static int getRender() { return getInt("render", 0); }