[mobile] live support speed and seek

pull/473/head
okjack 2 years ago
parent eb5dbbbb65
commit 9e397f2fb8
  1. 1
      app/src/main/java/com/fongmi/android/tv/bean/Catchup.java
  2. 5
      app/src/main/java/com/fongmi/android/tv/bean/Epg.java
  3. 67
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  4. 6
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  5. 31
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
  6. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java
  7. 2
      app/src/mobile/res/layout/view_widget_display.xml
  8. 40
      app/src/mobile/res/layout/view_widget_live.xml

@ -94,6 +94,7 @@ public class Catchup {
public String format(String url, EpgData data) {
String result = getSource();
if (data.isInRange()) return url;
Matcher matcher = Pattern.compile("(\\$\\{[^}]*\\})").matcher(result);
while (matcher.find()) result = result.replace(matcher.group(1), data.format(matcher.group(1)));
return isDefault() ? result : format(url, result);

@ -90,4 +90,9 @@ public class Epg {
for (int i = 0; i < getList().size(); i++) if (getList().get(i).isSelected()) return i;
return -1;
}
public int getInRange() {
for (int i = 0; i < getList().size(); i++) if (getList().get(i).isInRange()) return i;
return -1;
}
}

@ -159,7 +159,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
@Override
protected void initView(Bundle savedInstanceState) {
mKeyDown = CustomKeyDownLive.create(this, mBinding.video);
mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time));
mClock = Clock.create(Arrays.asList(mBinding.widget.clock, mBinding.display.clock));
setPadding(mBinding.control.getRoot());
setPadding(mBinding.widget.epg, true);
setPadding(mBinding.recycler, true);
@ -551,7 +551,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
private void showDisplayInfo() {
boolean controlVisible = isVisible(mBinding.control.getRoot()) || isVisible(mBinding.widget.info);
boolean visible = (!controlVisible && !isLock());
mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.clock.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(View.GONE);
}
@ -827,7 +827,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
if (isVisible(mBinding.control.getRoot())) showControl();
break;
case Player.STATE_ENDED:
nextEpg();
checkNext();
break;
}
}
@ -934,33 +934,29 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
if (!mGroup.isEmpty()) onItemClick(mGroup.current());
}
public void nextEpg() {
private void checkNext() {
int current = mChannel.getData().getInRange();
int position = mChannel.getData().getSelected() + 1;
boolean limit = position > mEpgDataAdapter.getItemCount() - 1;
if (!limit) onItemClick(mChannel.getData().getList().get(position));
boolean hasNext = position <= current && position > 0;
if (hasNext) onItemClick(mChannel.getData().getList().get(position));
else nextChannel();
}
private void prevLine() {
if (mChannel == null) return;
if (mChannel == null || mChannel.isOnly()) return;
mChannel.prevLine();
showInfo();
fetch();
}
private void nextLine(boolean show) {
if (mChannel == null) return;
if (mChannel == null || mChannel.isOnly()) return;
mChannel.nextLine();
if (show) showInfo();
else setInfo();
fetch();
}
private void seekTo() {
mPlayers.seekTo(Constant.INTERVAL_SEEK * 3);
showProgress();
}
private void onPaused() {
checkPlayImg(false);
mPlayers.pause();
@ -1036,6 +1032,21 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
public void onCasted() {
}
@Override
public void onSpeedUp() {
if (!mPlayers.isVod() || !mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
mBinding.control.action.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
mBinding.widget.speed.setVisibility(View.VISIBLE);
}
@Override
public void onSpeedEnd() {
mBinding.control.action.speed.setText(mPlayers.setSpeed(1.0f));
mBinding.widget.speed.setVisibility(View.GONE);
mBinding.widget.speed.clearAnimation();
}
@Override
public void onBright(int progress) {
mBinding.widget.bright.setVisibility(View.VISIBLE);
@ -1066,26 +1077,40 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom
@Override
public void onFlingUp() {
prevChannel();
if (!mPlayers.isVod()) prevChannel();
}
@Override
public void onFlingDown() {
nextChannel();
if (!mPlayers.isVod()) nextChannel();
}
@Override
public void onFlingLeft() {
if (mChannel == null) return;
if (mChannel.isOnly() && mPlayers.isVod()) App.post(this::seekTo, 250);
else if (!mChannel.isOnly()) prevLine();
if (!mPlayers.isVod()) prevLine();
}
@Override
public void onFlingRight() {
if (mChannel == null) return;
if (mChannel.isOnly() && mPlayers.isVod()) App.post(this::seekTo, 250);
else if (!mChannel.isOnly()) nextLine(true);
if (!mPlayers.isVod()) nextLine(true);
}
@Override
public void onSeek(int time) {
if (!mPlayers.isVod()) return;
mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind);
mBinding.widget.time.setText(mPlayers.getPositionTime(time));
mBinding.widget.seek.setVisibility(View.VISIBLE);
hideProgress();
}
@Override
public void onSeekEnd(int time) {
if (!mPlayers.isVod()) return;
mBinding.widget.seek.setVisibility(View.GONE);
mPlayers.seekTo(time);
showProgress();
onPlay();
}
@Override

@ -311,7 +311,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mObserveSearch = this::setSearch;
mDialogs = new ArrayList<>();
mBroken = new ArrayList<>();
mClock = Clock.create(Arrays.asList(mBinding.display.time, mBinding.control.time));
mClock = Clock.create(Arrays.asList(mBinding.display.clock, mBinding.control.time));
mR0 = this::stopService;
mR1 = this::hideControl;
mR2 = this::setTraffic;
@ -939,7 +939,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && isInPictureInPictureMode()) pictureMode = true;
boolean controlVisible = isVisible(mBinding.control.getRoot());
boolean visible = (!controlVisible || isLock()) && !pictureMode;
mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.clock.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE);
mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE);
mBinding.display.duration.setVisibility(Setting.isDisplayDuration() && visible ? View.VISIBLE : View.GONE);
mBinding.display.progress.setVisibility(Setting.isDisplayMiniProgress() && visible && (mPlayers.getDuration() > 60000) ? View.VISIBLE : View.GONE);
@ -1645,8 +1645,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Override
public void onSeek(int time) {
mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind);
mBinding.widget.seek.setVisibility(View.VISIBLE);
mBinding.widget.time.setText(mPlayers.getPositionTime(time));
mBinding.widget.seek.setVisibility(View.VISIBLE);
hideProgress();
}

@ -26,11 +26,14 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
private final View videoView;
private boolean changeBright;
private boolean changeVolume;
private boolean changeSpeed;
private boolean changeTime;
private boolean center;
private boolean touch;
private boolean lock;
private float bright;
private float volume;
private int time;
public static CustomKeyDownLive create(Activity activity, View videoView) {
return new CustomKeyDownLive(activity, videoView);
@ -45,6 +48,8 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
}
public boolean onTouchEvent(MotionEvent e) {
if (changeTime && e.getAction() == MotionEvent.ACTION_UP) onSeekEnd();
if (changeSpeed && e.getAction() == MotionEvent.ACTION_UP) listener.onSpeedEnd();
if (changeBright && e.getAction() == MotionEvent.ACTION_UP) listener.onBrightEnd();
if (changeVolume && e.getAction() == MotionEvent.ACTION_UP) listener.onVolumeEnd();
return e.getPointerCount() == 1 && detector.onTouchEvent(e);
@ -65,16 +70,27 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
bright = Util.getBrightness(activity);
changeBright = false;
changeVolume = false;
changeSpeed = false;
changeTime = false;
center = false;
touch = true;
return true;
}
@Override
public void onLongPress(@NonNull MotionEvent e) {
if (isEdge(e) || lock) return;
changeSpeed = true;
listener.onSpeedUp();
}
@Override
public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
if (isEdge(e1) || lock) return true;
float deltaX = e2.getX() - e1.getX();
float deltaY = e1.getY() - e2.getY();
if (touch) checkFunc(distanceX, distanceY, e2);
if (changeTime) listener.onSeek(time = (int) deltaX * 50);
if (changeBright) setBright(deltaY);
if (changeVolume) setVolume(deltaY);
return true;
@ -101,10 +117,17 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
return true;
}
private void onSeekEnd() {
listener.onSeekEnd(time);
changeTime = false;
time = 0;
}
private void checkFunc(float distanceX, float distanceY, MotionEvent e2) {
int four = ResUtil.getScreenWidthNav() / 4;
if (e2.getX() > four && e2.getX() < four * 3) center = true;
else if (Math.abs(distanceX) < Math.abs(distanceY)) checkSide(e2);
if (Math.abs(distanceX) >= Math.abs(distanceY)) changeTime = true;
touch = false;
}
@ -153,6 +176,10 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
public interface Listener {
void onSpeedUp();
void onSpeedEnd();
void onBright(int progress);
void onBrightEnd();
@ -169,6 +196,10 @@ public class CustomKeyDownLive extends GestureDetector.SimpleOnGestureListener {
void onFlingRight();
void onSeek(int time);
void onSeekEnd(int time);
void onSingleTap();
void onDoubleTap();

@ -129,7 +129,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis
private void displayTime() {
boolean display = Setting.isDisplayTime();
parent.display.time.setVisibility(!display ? View.VISIBLE : View.GONE);
parent.display.clock.setVisibility(!display ? View.VISIBLE : View.GONE);
Setting.putDisplayTime(!display);
binding.dptime.setActivated(!display);
}

@ -5,7 +5,7 @@
android:layout_height="match_parent">
<TextView
android:id="@+id/time"
android:id="@+id/clock"
android:padding="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

@ -56,6 +56,44 @@
</LinearLayout>
<LinearLayout
android:id="@+id/seek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|center"
android:layout_marginTop="24dp"
android:background="@drawable/shape_widget"
android:gravity="center"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:src="@drawable/ic_widget_rewind" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="00:00:00" />
</LinearLayout>
<ImageView
android:id="@+id/speed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|center"
android:layout_marginTop="24dp"
android:src="@drawable/ic_widget_forward"
android:visibility="gone" />
<LinearLayout
android:id="@+id/bright"
android:layout_width="wrap_content"
@ -173,7 +211,7 @@
tools:text="來源 1" />
<TextView
android:id="@+id/time"
android:id="@+id/clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"

Loading…
Cancel
Save