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);
}