From ae35ea1efc1be03c631afd2a3b97a74951eb4588 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 11 Oct 2023 17:05:37 +0800 Subject: [PATCH] Add buffer setting --- .../tv/ui/activity/SettingPlayerActivity.java | 16 ++++- .../tv/ui/custom/dialog/BufferDialog.java | 66 +++++++++++++++++++ .../res/layout/activity_setting_player.xml | 38 +++++++++++ app/src/leanback/res/layout/dialog_buffer.xml | 58 ++++++++++++++++ .../java/com/fongmi/android/tv/Setting.java | 8 +++ .../android/tv/impl/BufferCallback.java | 6 ++ .../com/fongmi/android/tv/player/ExoUtil.java | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + .../tv/ui/custom/dialog/BufferDialog.java | 55 ++++++++++++++++ .../tv/ui/fragment/SettingPlayerFragment.java | 16 ++++- app/src/mobile/res/layout/dialog_buffer.xml | 20 ++++++ .../res/layout/fragment_setting_player.xml | 36 ++++++++++ 14 files changed, 324 insertions(+), 3 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java create mode 100644 app/src/leanback/res/layout/dialog_buffer.xml create mode 100644 app/src/main/java/com/fongmi/android/tv/impl/BufferCallback.java create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java create mode 100644 app/src/mobile/res/layout/dialog_buffer.xml 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