support live - part 5

pull/123/head
FongMi 4 years ago
parent e3ce57f6a2
commit 428116ff4b
  1. 34
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 2
      app/src/leanback/res/layout/activity_live.xml
  3. 7
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  4. 45
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  5. 91
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  6. 8
      app/src/main/java/com/fongmi/android/tv/utils/Prefers.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

@ -37,7 +37,7 @@
<androidx.leanback.widget.VerticalGridView
android:id="@+id/group"
android:layout_width="160dp"
android:layout_width="140dp"
android:layout_height="match_parent"
tools:itemCount="5"
tools:listitem="@layout/adapter_group" />

@ -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) {

@ -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<Live> 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#")) {

@ -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<Channel> channels;
@SerializedName("groups")
private List<Group> groups;
public Live(String name, List<Group> groups) {
private boolean activated;
public static Live objectFrom(JsonElement element) {
return new Gson().fromJson(element, Live.class);
}
public static List<Live> arrayFrom(String str) {
Type listType = new TypeToken<ArrayList<Live>>() {}.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<Channel> getChannels() {
return channels = channels == null ? new ArrayList<>() : channels;
}
public List<Group> 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());
}
}

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

Loading…
Cancel
Save