diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java
index 3834083de..0ce66780a 100644
--- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java
@@ -9,16 +9,18 @@ import androidx.viewbinding.ViewBinding;
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.SubtitleCallback;
import com.fongmi.android.tv.impl.UaCallback;
import com.fongmi.android.tv.player.ExoUtil;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.ui.base.BaseActivity;
+import com.fongmi.android.tv.ui.custom.dialog.BufferDialog;
import com.fongmi.android.tv.ui.custom.dialog.SubtitleDialog;
import com.fongmi.android.tv.ui.custom.dialog.UaDialog;
import com.fongmi.android.tv.utils.ResUtil;
-public class SettingPlayerActivity extends BaseActivity implements UaCallback, SubtitleCallback {
+public class SettingPlayerActivity extends BaseActivity implements UaCallback, BufferCallback, SubtitleCallback {
private ActivitySettingPlayerBinding mBinding;
private String[] http;
@@ -41,8 +43,10 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, S
protected void initView() {
mBinding.uaText.setText(Setting.getUa());
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
+ mBinding.bufferText.setText(String.valueOf(Setting.getBuffer()));
mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle()));
mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
+ mBinding.buffer.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]);
mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]);
@@ -53,6 +57,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, S
mBinding.ua.setOnClickListener(this::onUa);
mBinding.http.setOnClickListener(this::setHttp);
mBinding.flag.setOnClickListener(this::setFlag);
+ mBinding.buffer.setOnClickListener(this::onBuffer);
mBinding.tunnel.setOnClickListener(this::setTunnel);
mBinding.subtitle.setOnClickListener(this::onSubtitle);
}
@@ -79,6 +84,10 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, S
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
}
+ private void onBuffer(View view) {
+ BufferDialog.create(this).show();
+ }
+
private void onSubtitle(View view) {
SubtitleDialog.create(this).show();
}
@@ -89,6 +98,11 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback, S
Setting.putUa(ua);
}
+ @Override
+ public void setBuffer(int minute) {
+ mBinding.bufferText.setText(String.valueOf(minute));
+ }
+
@Override
public void setSubtitle(int size) {
mBinding.subtitleText.setText(String.valueOf(size));
diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
new file mode 100644
index 000000000..1070124bb
--- /dev/null
+++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
@@ -0,0 +1,66 @@
+package com.fongmi.android.tv.ui.custom.dialog;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+
+import com.fongmi.android.tv.Setting;
+import com.fongmi.android.tv.databinding.DialogBufferBinding;
+import com.fongmi.android.tv.impl.BufferCallback;
+import com.fongmi.android.tv.utils.ResUtil;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+public class BufferDialog {
+
+ private final DialogBufferBinding binding;
+ private final BufferCallback callback;
+ private final AlertDialog dialog;
+ private int value;
+
+ public static BufferDialog create(FragmentActivity activity) {
+ return new BufferDialog(activity);
+ }
+
+ public BufferDialog(FragmentActivity activity) {
+ this.callback = (BufferCallback) activity;
+ this.binding = DialogBufferBinding.inflate(LayoutInflater.from(activity));
+ this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create();
+ }
+
+ public void show() {
+ initDialog();
+ initView();
+ initEvent();
+ }
+
+ private void initDialog() {
+ WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
+ params.width = (int) (ResUtil.getScreenWidth() * 0.45f);
+ dialog.getWindow().setAttributes(params);
+ dialog.getWindow().setDimAmount(0);
+ dialog.show();
+ }
+
+ private void initView() {
+ binding.slider.setValue(value = Setting.getBuffer());
+ }
+
+ private void initEvent() {
+ binding.positive.setOnClickListener(this::onPositive);
+ binding.negative.setOnClickListener(this::onNegative);
+ }
+
+ private void onPositive(View view) {
+ callback.setBuffer((int) binding.slider.getValue());
+ Setting.putBuffer((int) binding.slider.getValue());
+ dialog.dismiss();
+ }
+
+ private void onNegative(View view) {
+ callback.setBuffer(value);
+ dialog.dismiss();
+ }
+}
diff --git a/app/src/leanback/res/layout/activity_setting_player.xml b/app/src/leanback/res/layout/activity_setting_player.xml
index ebbe32e6d..1bc9a07e2 100644
--- a/app/src/leanback/res/layout/activity_setting_player.xml
+++ b/app/src/leanback/res/layout/activity_setting_player.xml
@@ -160,5 +160,43 @@
tools:text="OkHttp" />
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/leanback/res/layout/dialog_buffer.xml b/app/src/leanback/res/layout/dialog_buffer.xml
new file mode 100644
index 000000000..d004ab7b0
--- /dev/null
+++ b/app/src/leanback/res/layout/dialog_buffer.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java
index 8bfe3c2ef..7a1465b51 100644
--- a/app/src/main/java/com/fongmi/android/tv/Setting.java
+++ b/app/src/main/java/com/fongmi/android/tv/Setting.java
@@ -214,6 +214,14 @@ public class Setting {
Prefers.put("exo_http", http);
}
+ public static int getBuffer() {
+ return Math.max(Prefers.getInt("exo_buffer"), 1);
+ }
+
+ public static void putBuffer(int buffer) {
+ Prefers.put("exo_buffer", buffer);
+ }
+
public static int getFlag() {
return Prefers.getInt("flag");
}
diff --git a/app/src/main/java/com/fongmi/android/tv/impl/BufferCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/BufferCallback.java
new file mode 100644
index 000000000..b3300dae4
--- /dev/null
+++ b/app/src/main/java/com/fongmi/android/tv/impl/BufferCallback.java
@@ -0,0 +1,6 @@
+package com.fongmi.android.tv.impl;
+
+public interface BufferCallback {
+
+ void setBuffer(int minute);
+}
diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
index 5427276cb..081162abb 100644
--- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
+++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
@@ -63,7 +63,7 @@ public class ExoUtil {
private static Cache cache;
public static LoadControl buildLoadControl() {
- return new DefaultLoadControl();
+ return new DefaultLoadControl.Builder().setBufferDurationsMs(DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, Setting.getBuffer() * 60 * 1000, DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS, DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS).build();
}
public static TrackSelector buildTrackSelector() {
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 054cbb3be..ff654368c 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -69,6 +69,7 @@
User-Agent
线路播放
连线方式
+ 缓冲时间
隧道模式
字幕大小
后台播放
@@ -123,6 +124,7 @@
全部
+ 分钟
- 软解
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 6d4a4063a..11e61bc0e 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -69,6 +69,7 @@
User-Agent
線路播放
連線方式
+ 緩衝時間
隧道模式
字幕大小
背景播放
@@ -123,6 +124,7 @@
全部
+ 分鐘
- 軟解
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0485c7a63..151ade495 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -69,6 +69,7 @@
User-Agent
Flag play
HTTP method
+ Buffer time
Tunnel mode
Subtitle size
Background play
@@ -123,6 +124,7 @@
All
+ min
- Soft
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
new file mode 100644
index 000000000..c9865f793
--- /dev/null
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
@@ -0,0 +1,55 @@
+package com.fongmi.android.tv.ui.custom.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.DialogBufferBinding;
+import com.fongmi.android.tv.impl.BufferCallback;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+public class BufferDialog {
+
+ private final DialogBufferBinding binding;
+ private final BufferCallback callback;
+ private int value;
+
+ public static BufferDialog create(Fragment fragment) {
+ return new BufferDialog(fragment);
+ }
+
+ public BufferDialog(Fragment fragment) {
+ this.callback = (BufferCallback) fragment;
+ this.binding = DialogBufferBinding.inflate(LayoutInflater.from(fragment.getContext()));
+ }
+
+ public void show() {
+ initDialog();
+ initView();
+ }
+
+ private void initDialog() {
+ AlertDialog dialog = new MaterialAlertDialogBuilder(binding.getRoot().getContext()).setTitle(R.string.setting_player_buffer).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.getBuffer());
+ }
+
+ private void onPositive(DialogInterface dialog, int which) {
+ callback.setBuffer((int) binding.slider.getValue());
+ Setting.putBuffer((int) binding.slider.getValue());
+ dialog.dismiss();
+ }
+
+ private void onNegative(DialogInterface dialog, int which) {
+ callback.setBuffer(value);
+ dialog.dismiss();
+ }
+}
diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
index 21fb005f6..4fe6d128d 100644
--- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
+++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
@@ -11,17 +11,19 @@ import androidx.viewbinding.ViewBinding;
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.SubtitleCallback;
import com.fongmi.android.tv.impl.UaCallback;
import com.fongmi.android.tv.player.ExoUtil;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.ui.base.BaseFragment;
+import com.fongmi.android.tv.ui.custom.dialog.BufferDialog;
import com.fongmi.android.tv.ui.custom.dialog.SubtitleDialog;
import com.fongmi.android.tv.ui.custom.dialog.UaDialog;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-public class SettingPlayerFragment extends BaseFragment implements UaCallback, SubtitleCallback {
+public class SettingPlayerFragment extends BaseFragment implements UaCallback, BufferCallback, SubtitleCallback {
private FragmentSettingPlayerBinding mBinding;
private String[] background;
@@ -45,6 +47,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, S
protected void initView() {
mBinding.uaText.setText(Setting.getUa());
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
+ mBinding.bufferText.setText(String.valueOf(Setting.getBuffer()));
mBinding.subtitleText.setText(String.valueOf(Setting.getSubtitle()));
mBinding.flagText.setText((flag = ResUtil.getStringArray(R.array.select_flag))[Setting.getFlag()]);
mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]);
@@ -57,6 +60,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, S
mBinding.ua.setOnClickListener(this::onUa);
mBinding.http.setOnClickListener(this::setHttp);
mBinding.flag.setOnClickListener(this::setFlag);
+ mBinding.buffer.setOnClickListener(this::onBuffer);
mBinding.tunnel.setOnClickListener(this::setTunnel);
mBinding.subtitle.setOnClickListener(this::onSubtitle);
mBinding.background.setOnClickListener(this::setBackground);
@@ -64,6 +68,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, S
private void setVisible() {
mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
+ mBinding.buffer.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE);
}
@@ -89,6 +94,10 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, S
mBinding.tunnelText.setText(getSwitch(Setting.isTunnel()));
}
+ private void onBuffer(View view) {
+ BufferDialog.create(this).show();
+ }
+
private void onSubtitle(View view) {
SubtitleDialog.create(this).show();
}
@@ -107,6 +116,11 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback, S
Setting.putUa(ua);
}
+ @Override
+ public void setBuffer(int minute) {
+ mBinding.bufferText.setText(String.valueOf(minute));
+ }
+
@Override
public void setSubtitle(int size) {
mBinding.subtitleText.setText(String.valueOf(size));
diff --git a/app/src/mobile/res/layout/dialog_buffer.xml b/app/src/mobile/res/layout/dialog_buffer.xml
new file mode 100644
index 000000000..8d1da7e54
--- /dev/null
+++ b/app/src/mobile/res/layout/dialog_buffer.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/mobile/res/layout/fragment_setting_player.xml b/app/src/mobile/res/layout/fragment_setting_player.xml
index b71a8a256..1296fa2bb 100644
--- a/app/src/mobile/res/layout/fragment_setting_player.xml
+++ b/app/src/mobile/res/layout/fragment_setting_player.xml
@@ -206,6 +206,42 @@
tools:text="OkHttp" />
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file