Optimize live vod

pull/123/head
FongMi 3 years ago
parent 36a544e8e7
commit b6ea4a6958
  1. 116
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 25
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
  3. 8
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java
  4. 3
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java
  5. 15
      app/src/leanback/res/layout/view_controller_live.xml
  6. 53
      app/src/leanback/res/layout/view_widget_live.xml
  7. 14
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  8. 4
      app/src/main/java/com/fongmi/android/tv/player/Players.java

@ -78,6 +78,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private Runnable mR0;
private Runnable mR1;
private Runnable mR2;
private Runnable mR3;
private int count;
public static void start(Activity activity) {
@ -111,7 +112,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
protected void initView() {
mR0 = this::hideUI;
mR1 = this::hideInfo;
mR2 = this::setChannelActivated;
mR2 = this::hideCenter;
mR3 = this::setChannelActivated;
mPlayers = new Players().init();
mKeyDown = CustomKeyDownLive.create(this);
mFormatDate = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
@ -131,6 +133,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mControl.scale.setOnClickListener(view -> onScale());
mControl.speed.setOnClickListener(view -> onSpeed());
mControl.tracks.setOnClickListener(view -> onTracks());
mControl.line.setOnClickListener(view -> nextLine(false));
mControl.speed.setOnLongClickListener(view -> onSpeedLong());
mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
@Override
@ -270,43 +273,23 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
}
private void showInfo() {
mChannel.loadLogo(mBinding.widget.logo);
mControl.name.setText(mChannel.getName());
mControl.number.setText(mChannel.getNumber());
mBinding.widget.name.setText(mChannel.getName());
mBinding.widget.info.setVisibility(View.VISIBLE);
mBinding.widget.line.setText(mChannel.getLineText());
mBinding.widget.number.setText(mChannel.getNumber());
mBinding.widget.logo.setVisibility(mChannel.getVisible());
App.post(mR1, 5000);
checkEpg();
}
private void resetPass() {
this.count = 0;
setInfo();
}
private void checkEpg() {
if (mChannel.getEpg().isEmpty()) return;
String date = mFormatDate.format(new Date());
String epg = mChannel.getEpg().replace("{date}", date);
if (mChannel.getData().equal(date)) showEpg();
else getEpg(epg, mChannel);
private void showEpg() {
mControl.play.setText(mChannel.getData().getEpg());
mBinding.widget.play.setText(mChannel.getData().getEpg());
}
private void getEpg(String epg, Channel channel) {
OKHttp.newCall(epg).enqueue(new Callback() {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
channel.setData(Epg.objectFrom(response.body().string(), mFormatTime));
if (mChannel.equals(channel)) App.post(() -> showEpg());
}
});
private void hideCenter() {
mBinding.widget.action.setImageResource(R.drawable.ic_play);
mBinding.widget.center.setVisibility(View.GONE);
}
private void showEpg() {
mControl.play.setText(mChannel.getData().getEpg());
mBinding.widget.play.setText(mChannel.getData().getEpg());
private void resetPass() {
this.count = 0;
}
@Override
@ -353,15 +336,61 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
private void setChannel(Channel item) {
LiveConfig.get().setKeep(mGroup, mChannel = item);
App.post(mR2, 100);
App.post(mR3, 100);
showInfo();
}
private void setInfo() {
mChannel.loadLogo(mBinding.widget.logo);
mControl.name.setText(mChannel.getName());
mControl.line.setText(mChannel.getLineText());
mControl.number.setText(mChannel.getNumber());
mBinding.widget.name.setText(mChannel.getName());
mBinding.widget.line.setText(mChannel.getLineText());
mBinding.widget.number.setText(mChannel.getNumber());
mControl.line.setVisibility(mChannel.getLineVisible());
mBinding.widget.logo.setVisibility(mChannel.getLogoVisible());
mBinding.widget.line.setVisibility(mChannel.getLineVisible());
checkEpg();
}
private void checkEpg() {
if (mChannel.getEpg().isEmpty()) return;
String date = mFormatDate.format(new Date());
String epg = mChannel.getEpg().replace("{date}", date);
if (mChannel.getData().equal(date)) showEpg();
else getEpg(epg, mChannel);
}
private void getEpg(String epg, Channel channel) {
OKHttp.newCall(epg).enqueue(new Callback() {
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
channel.setData(Epg.objectFrom(response.body().string(), mFormatTime));
if (mChannel.equals(channel)) App.post(() -> showEpg());
}
});
}
private void getUrl() {
mBinding.widget.progress.getRoot().setVisibility(View.VISIBLE);
mViewModel.getUrl(mChannel);
}
private void prevLine(boolean show) {
mChannel.prevLine();
if (show) showInfo();
else setInfo();
getUrl();
}
private void nextLine(boolean show) {
mChannel.nextLine();
if (show) showInfo();
else setInfo();
getUrl();
}
@Override
public boolean nextGroup(boolean skip) {
int position = mBinding.group.getSelectedPosition() + 1;
@ -411,6 +440,23 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
setPosition(LiveConfig.get().find(number, mGroupAdapter.unmodifiableList()));
}
@Override
public void onSeeking(int time) {
if (!mPlayers.isVod()) return;
mBinding.widget.exoDuration.setText(mControl.exoDuration.getText());
mBinding.widget.exoPosition.setText(mPlayers.getTime(time));
mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_forward : R.drawable.ic_rewind);
mBinding.widget.center.setVisibility(View.VISIBLE);
}
@Override
public void onSeekTo(int time) {
if (!mPlayers.isVod()) return;
mPlayers.seekTo(time);
mKeyDown.resetTime();
App.post(mR2, 500);
}
@Override
public void onKeyUp() {
int position = mGroup.getPosition() - 1;
@ -430,17 +476,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onKeyLeft() {
if (mChannel.getUrls().size() == 1) return;
mChannel.prevLine();
showInfo();
getUrl();
prevLine(true);
}
@Override
public void onKeyRight() {
if (mChannel.getUrls().size() == 1) return;
mChannel.nextLine();
showInfo();
getUrl();
nextLine(true);
}
@Override

@ -10,6 +10,7 @@ public class CustomKeyDownLive {
private final Listener listener;
private final StringBuilder text;
private boolean press;
private int holdTime;
private final Runnable runnable = new Runnable() {
@Override
@ -36,14 +37,20 @@ public class CustomKeyDownLive {
}
public boolean onKeyDown(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) {
if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) {
listener.onSeeking(subTime());
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) {
listener.onSeeking(addTime());
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) {
listener.onKeyUp();
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) {
listener.onKeyDown();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) {
listener.onKeyLeft();
listener.onSeekTo(holdTime);
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) {
listener.onKeyRight();
listener.onSeekTo(holdTime);
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDigitKey(event)) {
onKeyDown(event.getKeyCode());
} else if (Utils.isEnterKey(event)) {
@ -70,12 +77,28 @@ public class CustomKeyDownLive {
return keyCode >= 144 ? keyCode - 144 : keyCode - 7;
}
private int addTime() {
return holdTime = holdTime + 10000;
}
private int subTime() {
return holdTime = holdTime - 10000;
}
public void resetTime() {
holdTime = 0;
}
public interface Listener {
void onShow(String number);
void onFind(String number);
void onSeeking(int time);
void onSeekTo(int time);
void onKeyUp();
void onKeyDown();

@ -34,6 +34,10 @@ public class CustomKeyDownVod {
return true;
}
public boolean hasEvent(KeyEvent event) {
return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event);
}
private int addTime() {
return holdTime = holdTime + 10000;
}
@ -46,10 +50,6 @@ public class CustomKeyDownVod {
holdTime = 0;
}
public boolean hasEvent(KeyEvent event) {
return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event);
}
public interface Listener {
void onSeeking(int time);

@ -36,8 +36,7 @@ public class ChannelPresenter extends Presenter {
item.loadLogo(holder.binding.logo);
holder.binding.name.setText(item.getName());
holder.binding.number.setText(item.getNumber());
holder.binding.logo.setVisibility(item.getVisible());
holder.binding.getRoot().setSelected(item.isSelected());
holder.binding.logo.setVisibility(item.getLogoVisible());
setOnClickListener(holder, view -> mListener.onItemClick(item));
holder.view.setOnLongClickListener(view -> mListener.onLongClick(item));
}

@ -36,8 +36,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:maxEms="30"
android:singleLine="true"
android:textColor="@color/grey_800"
android:textSize="18sp"
@ -67,6 +66,18 @@
android:textSize="14sp"
tools:text="首頁" />
<TextView
android:id="@+id/line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="來源 1" />
<TextView
android:id="@+id/speed"
android:layout_width="wrap_content"

@ -28,6 +28,59 @@
tools:text="05"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/shape_item_activated"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/action"
android:layout_width="56dp"
android:layout_height="56dp"
android:background="?attr/selectableItemBackground"
android:scaleType="fitCenter"
android:src="@drawable/ic_play" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/exo_position"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="00:00:00" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:text="/"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/exo_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="00:00:00" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/info"
android:layout_width="match_parent"

@ -144,22 +144,18 @@ public class Channel {
this.line = line;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void setSelected(Channel item) {
this.selected = item.equals(this);
}
public int getVisible() {
public int getLogoVisible() {
return getLogo().isEmpty() ? View.GONE : View.VISIBLE;
}
public int getLineVisible() {
return getUrls().size() == 1 ? View.GONE : View.VISIBLE;
}
public void loadLogo(ImageView view) {
if (!getLogo().isEmpty()) Glide.with(App.get()).load(getLogo()).into(view);
}

@ -122,6 +122,10 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca
return exoPlayer != null && exoPlayer.getPlaybackState() == Player.STATE_IDLE;
}
public boolean isVod() {
return getDuration() > 5 * 60 * 1000;
}
public boolean canNext() {
return getCurrentPosition() >= getDuration();
}

Loading…
Cancel
Save