Add speed setting

pull/586/head
FongMi 2 years ago
parent 6d52b1820d
commit 70f006df8d
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
  2. 20
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java
  3. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  4. 53
      app/src/leanback/java/com/fongmi/android/tv/ui/dialog/SpeedDialog.java
  5. 38
      app/src/leanback/res/layout/activity_setting_player.xml
  6. 20
      app/src/leanback/res/layout/dialog_speed.xml
  7. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  8. 6
      app/src/main/java/com/fongmi/android/tv/impl/SpeedCallback.java
  9. 2
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  10. 1
      app/src/main/res/values-zh-rCN/strings.xml
  11. 1
      app/src/main/res/values-zh-rTW/strings.xml
  12. 1
      app/src/main/res/values/strings.xml
  13. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  14. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  15. 54
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/SpeedDialog.java
  16. 20
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
  17. 21
      app/src/mobile/res/layout/dialog_speed.xml
  18. 36
      app/src/mobile/res/layout/fragment_setting_player.xml
  19. 10
      catvod/src/main/java/com/github/catvod/utils/Prefers.java
  20. 2
      catvod/src/main/java/com/github/catvod/utils/UriUtil.java

@ -465,7 +465,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List
@Override
public void onSpeedUp() {
if (!mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
mBinding.control.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
mBinding.control.speed.setText(mPlayers.setSpeed(Setting.getSpeed()));
mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
mBinding.widget.speed.setVisibility(View.VISIBLE);
}

@ -11,17 +11,22 @@ import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.ActivitySettingPlayerBinding;
import com.fongmi.android.tv.impl.BufferCallback;
import com.fongmi.android.tv.impl.SpeedCallback;
import com.fongmi.android.tv.impl.SubtitleCallback;
import com.fongmi.android.tv.impl.UaCallback;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.dialog.BufferDialog;
import com.fongmi.android.tv.ui.dialog.SpeedDialog;
import com.fongmi.android.tv.ui.dialog.SubtitleDialog;
import com.fongmi.android.tv.ui.dialog.UaDialog;
import com.fongmi.android.tv.utils.ResUtil;
public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback {
import java.text.DecimalFormat;
public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SpeedCallback, SubtitleCallback {
private ActivitySettingPlayerBinding mBinding;
private DecimalFormat format;
private String[] caption;
private String[] render;
private String[] scale;
@ -43,9 +48,11 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B
@Override
protected void initView() {
setVisible();
format = new DecimalFormat("0.#");
mBinding.render.requestFocus();
mBinding.uaText.setText(Setting.getUa());
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
mBinding.speedText.setText(format.format(Setting.getSpeed()));
mBinding.bufferText.setText(String.valueOf(Setting.getBuffer()));
mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle()));
mBinding.rtspText.setText((rtsp = ResUtil.getStringArray(R.array.select_rtsp))[Setting.getRtsp()]);
@ -59,6 +66,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B
mBinding.ua.setOnClickListener(this::onUa);
mBinding.rtsp.setOnClickListener(this::setRtsp);
mBinding.scale.setOnClickListener(this::setScale);
mBinding.speed.setOnClickListener(this::onSpeed);
mBinding.buffer.setOnClickListener(this::onBuffer);
mBinding.render.setOnClickListener(this::setRender);
mBinding.tunnel.setOnClickListener(this::setTunnel);
@ -93,6 +101,16 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, B
mBinding.scaleText.setText(scale[index]);
}
private void onSpeed(View view) {
SpeedDialog.create(this).show();
}
@Override
public void setSpeed(float speed) {
mBinding.speedText.setText(format.format(speed));
Setting.putSpeed(speed);
}
private void onBuffer(View view) {
BufferDialog.create(this).show();
}

@ -1369,7 +1369,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
@Override
public void onSpeedUp() {
if (!mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
mBinding.control.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
mBinding.control.speed.setText(mPlayers.setSpeed(Setting.getSpeed()));
mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
mBinding.widget.speed.setVisibility(View.VISIBLE);
}

@ -0,0 +1,53 @@
package com.fongmi.android.tv.ui.dialog;
import android.view.LayoutInflater;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.DialogSpeedBinding;
import com.fongmi.android.tv.impl.SpeedCallback;
import com.fongmi.android.tv.utils.KeyUtil;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class SpeedDialog {
private final DialogSpeedBinding binding;
private final SpeedCallback callback;
private final AlertDialog dialog;
public static SpeedDialog create(FragmentActivity activity) {
return new SpeedDialog(activity);
}
public SpeedDialog(FragmentActivity activity) {
this.callback = (SpeedCallback) activity;
this.binding = DialogSpeedBinding.inflate(LayoutInflater.from(activity));
this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create();
}
public void show() {
initDialog();
initView();
initEvent();
}
private void initDialog() {
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.show();
}
private void initView() {
binding.slider.setValue(Setting.getSpeed());
}
private void initEvent() {
binding.slider.addOnChangeListener((slider, value, fromUser) -> callback.setSpeed(value));
binding.slider.setOnKeyListener((view, keyCode, event) -> {
boolean enter = KeyUtil.isEnterKey(event);
if (enter) dialog.dismiss();
return enter;
});
}
}

@ -167,6 +167,44 @@
</LinearLayout>
<LinearLayout
android:id="@+id/speed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/player_speed"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/speedText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="@string/times"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/tunnel"
android:layout_width="match_parent"

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="48dp">
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stepSize="0.5"
android:valueFrom="2"
android:valueTo="5"
app:thumbColor="@color/blue_500"
app:tickVisible="false"
app:trackColorActive="@color/blue_500"
app:trackColorInactive="@color/blue_50" />
</FrameLayout>

@ -257,6 +257,14 @@ public class Setting {
Prefers.put("zhuyin", zhuyin);
}
public static float getSpeed() {
return Math.min(Math.max(Prefers.getFloat("speed", 3), 2), 5);
}
public static void putSpeed(float speed) {
Prefers.put("speed", speed);
}
public static float getThumbnail() {
return 0.3f * getQuality() + 0.4f;
}

@ -0,0 +1,6 @@
package com.fongmi.android.tv.impl;
public interface SpeedCallback {
void setSpeed(float speed);
}

@ -273,7 +273,7 @@ public class Players implements Player.Listener, ParseCallback {
public String toggleSpeed() {
float speed = getSpeed();
speed = speed == 1 ? 3f : 1f;
speed = speed == 1 ? Setting.getSpeed() : 1;
return setSpeed(speed);
}

@ -86,6 +86,7 @@
<string name="player_background">后台播放</string>
<string name="player_tunnel">隧道模式</string>
<string name="player_buffer">缓冲时间</string>
<string name="player_speed">长按倍速</string>
<string name="player_rtsp">RTSP 通道</string>
<string name="player_ua">User-Agent</string>

@ -86,6 +86,7 @@
<string name="player_background">背景播放</string>
<string name="player_tunnel">隧道模式</string>
<string name="player_buffer">緩衝時間</string>
<string name="player_speed">長按倍速</string>
<string name="player_rtsp">RTSP 通道</string>
<string name="player_ua">User-Agent</string>

@ -87,6 +87,7 @@
<string name="player_background">Background play</string>
<string name="player_tunnel">Tunnel mode</string>
<string name="player_buffer">Buffer time</string>
<string name="player_speed">Press speed</string>
<string name="player_rtsp">RTSP channel</string>
<string name="player_ua">User-Agent</string>

@ -946,7 +946,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
@Override
public void onSpeedUp() {
if (mPlayers.isLive() || !mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
mBinding.control.action.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
mBinding.control.action.speed.setText(mPlayers.setSpeed(Setting.getSpeed()));
mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
mBinding.widget.speed.setVisibility(View.VISIBLE);
}

@ -1412,7 +1412,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Override
public void onSpeedUp() {
if (!mPlayers.isPlaying() || !mPlayers.canAdjustSpeed()) return;
mBinding.control.action.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5));
mBinding.control.action.speed.setText(mPlayers.setSpeed(Setting.getSpeed()));
mBinding.widget.speed.startAnimation(ResUtil.getAnim(R.anim.forward));
mBinding.widget.speed.setVisibility(View.VISIBLE);
}

@ -0,0 +1,54 @@
package com.fongmi.android.tv.ui.dialog;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.DialogSpeedBinding;
import com.fongmi.android.tv.impl.SpeedCallback;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class SpeedDialog {
private final DialogSpeedBinding binding;
private final SpeedCallback callback;
private float value;
public static SpeedDialog create(Fragment fragment) {
return new SpeedDialog(fragment);
}
public SpeedDialog(Fragment fragment) {
this.callback = (SpeedCallback) fragment;
this.binding = DialogSpeedBinding.inflate(LayoutInflater.from(fragment.getContext()));
}
public void show() {
initDialog();
initView();
}
private void initDialog() {
AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.player_speed).setView(binding.getRoot()).setPositiveButton(R.string.dialog_positive, this::onPositive).setNegativeButton(R.string.dialog_negative, this::onNegative).create();
dialog.getWindow().setDimAmount(0);
dialog.show();
}
private void initView() {
binding.slider.setValue(value = Setting.getSpeed());
}
private void onPositive(DialogInterface dialog, int which) {
callback.setSpeed(binding.slider.getValue());
dialog.dismiss();
}
private void onNegative(DialogInterface dialog, int which) {
callback.setSpeed(value);
dialog.dismiss();
}
}

@ -14,18 +14,23 @@ import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.FragmentSettingPlayerBinding;
import com.fongmi.android.tv.impl.BufferCallback;
import com.fongmi.android.tv.impl.SpeedCallback;
import com.fongmi.android.tv.impl.SubtitleCallback;
import com.fongmi.android.tv.impl.UaCallback;
import com.fongmi.android.tv.ui.base.BaseFragment;
import com.fongmi.android.tv.ui.dialog.BufferDialog;
import com.fongmi.android.tv.ui.dialog.SpeedDialog;
import com.fongmi.android.tv.ui.dialog.SubtitleDialog;
import com.fongmi.android.tv.ui.dialog.UaDialog;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback {
import java.text.DecimalFormat;
public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SpeedCallback, SubtitleCallback {
private FragmentSettingPlayerBinding mBinding;
private DecimalFormat format;
private String[] background;
private String[] caption;
private String[] render;
@ -48,8 +53,10 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
@Override
protected void initView() {
setVisible();
format = new DecimalFormat("0.#");
mBinding.uaText.setText(Setting.getUa());
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
mBinding.speedText.setText(format.format(Setting.getSpeed()));
mBinding.bufferText.setText(String.valueOf(Setting.getBuffer()));
mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle()));
mBinding.rtspText.setText((rtsp = ResUtil.getStringArray(R.array.select_rtsp))[Setting.getRtsp()]);
@ -64,6 +71,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
mBinding.ua.setOnClickListener(this::onUa);
mBinding.rtsp.setOnClickListener(this::setRtsp);
mBinding.scale.setOnClickListener(this::onScale);
mBinding.speed.setOnClickListener(this::onSpeed);
mBinding.buffer.setOnClickListener(this::onBuffer);
mBinding.render.setOnClickListener(this::setRender);
mBinding.tunnel.setOnClickListener(this::setTunnel);
@ -101,6 +109,16 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, B
}).show();
}
private void onSpeed(View view) {
SpeedDialog.create(this).show();
}
@Override
public void setSpeed(float speed) {
mBinding.speedText.setText(format.format(speed));
Setting.putSpeed(speed);
}
private void onBuffer(View view) {
BufferDialog.create(this).show();
}

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="12dp"
android:paddingTop="16dp"
android:paddingEnd="12dp">
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stepSize="0.5"
android:valueFrom="2"
android:valueTo="5"
app:tickVisible="false"
app:trackColorInactive="@color/blue_50" />
</LinearLayout>

@ -188,6 +188,42 @@
</LinearLayout>
<LinearLayout
android:id="@+id/speed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/shape_item"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/player_speed"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/speedText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="@string/times"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/tunnel"
android:layout_width="match_parent"

@ -12,10 +12,14 @@ import com.google.gson.internal.LazilyParsedNumber;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Prefers {
private static final List<String> floats = Arrays.asList("speed");
private static SharedPreferences getPrefers() {
return PreferenceManager.getDefaultSharedPreferences(Init.context());
}
@ -104,6 +108,10 @@ public class Prefers {
}
private static Object convert(Map.Entry<String, ?> entry) {
return entry.getValue();
if (floats.contains(entry.getKey())) {
return Float.parseFloat(entry.getValue().toString());
} else {
return entry.getValue();
}
}
}

@ -159,7 +159,7 @@ public final class UriUtil {
} else if (i == segmentStart + 2 && uri.charAt(segmentStart) == '.' && uri.charAt(segmentStart + 1) == '.') {
// Given "abc/def/../ghi", remove "def/../" to get "abc/ghi".
int prevSegmentStart = uri.lastIndexOf("/", segmentStart - 2) + 1;
int removeFrom = prevSegmentStart > offset ? prevSegmentStart : offset;
int removeFrom = Math.max(prevSegmentStart, offset);
uri.delete(removeFrom, nextSegmentStart);
limit -= nextSegmentStart - removeFrom;
segmentStart = prevSegmentStart;

Loading…
Cancel
Save