Add buffer setting

pull/149/head
FongMi 3 years ago
parent b26a767cb2
commit ae35ea1efc
  1. 16
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java
  2. 66
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
  3. 38
      app/src/leanback/res/layout/activity_setting_player.xml
  4. 58
      app/src/leanback/res/layout/dialog_buffer.xml
  5. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  6. 6
      app/src/main/java/com/fongmi/android/tv/impl/BufferCallback.java
  7. 2
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  8. 2
      app/src/main/res/values-zh-rCN/strings.xml
  9. 2
      app/src/main/res/values-zh-rTW/strings.xml
  10. 2
      app/src/main/res/values/strings.xml
  11. 55
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/BufferDialog.java
  12. 16
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java
  13. 20
      app/src/mobile/res/layout/dialog_buffer.xml
  14. 36
      app/src/mobile/res/layout/fragment_setting_player.xml

@ -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));

@ -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();
}
}

@ -160,5 +160,43 @@
tools:text="OkHttp" />
</LinearLayout>
<LinearLayout
android:id="@+id/buffer"
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/setting_player_buffer"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/bufferText"
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/minute"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

@ -0,0 +1,58 @@
<?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:padding="16dp">
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:nextFocusDown="@id/positive"
android:stepSize="1"
android:valueFrom="1"
android:valueTo="120"
app:thumbColor="@color/blue_500"
app:trackColorActive="@color/blue_500"
app:trackColorInactive="@color/blue_50" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:singleLine="true"
android:text="@string/dialog_positive"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/negative"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:singleLine="true"
android:text="@string/dialog_negative"
android:textColor="@color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>

@ -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");
}

@ -0,0 +1,6 @@
package com.fongmi.android.tv.impl;
public interface BufferCallback {
void setBuffer(int minute);
}

@ -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() {

@ -69,6 +69,7 @@
<string name="setting_player_ua">User-Agent</string>
<string name="setting_player_flag">线路播放</string>
<string name="setting_player_http">连线方式</string>
<string name="setting_player_buffer">缓冲时间</string>
<string name="setting_player_tunnel">隧道模式</string>
<string name="setting_player_subtitle">字幕大小</string>
<string name="setting_player_background">后台播放</string>
@ -123,6 +124,7 @@
<!-- UNIT -->
<string name="all">全部</string>
<string name="minute">分钟</string>
<string-array name="select_decode">
<item>软解</item>

@ -69,6 +69,7 @@
<string name="setting_player_ua">User-Agent</string>
<string name="setting_player_flag">線路播放</string>
<string name="setting_player_http">連線方式</string>
<string name="setting_player_buffer">緩衝時間</string>
<string name="setting_player_tunnel">隧道模式</string>
<string name="setting_player_subtitle">字幕大小</string>
<string name="setting_player_background">背景播放</string>
@ -123,6 +124,7 @@
<!-- UNIT -->
<string name="all">全部</string>
<string name="minute">分鐘</string>
<string-array name="select_decode">
<item>軟解</item>

@ -69,6 +69,7 @@
<string name="setting_player_ua">User-Agent</string>
<string name="setting_player_flag">Flag play</string>
<string name="setting_player_http">HTTP method</string>
<string name="setting_player_buffer">Buffer time</string>
<string name="setting_player_tunnel">Tunnel mode</string>
<string name="setting_player_subtitle">Subtitle size</string>
<string name="setting_player_background">Background play</string>
@ -123,6 +124,7 @@
<!-- UNIT -->
<string name="all">All</string>
<string name="minute">min</string>
<string-array name="select_decode">
<item>Soft</item>

@ -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();
}
}

@ -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));

@ -0,0 +1,20 @@
<?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="24dp"
android:paddingTop="16dp"
android:paddingEnd="24dp">
<com.google.android.material.slider.Slider
android:id="@+id/slider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stepSize="1"
android:valueFrom="1"
android:valueTo="120"
app:trackColorInactive="@color/blue_50" />
</LinearLayout>

@ -206,6 +206,42 @@
tools:text="OkHttp" />
</LinearLayout>
<LinearLayout
android:id="@+id/buffer"
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/setting_player_buffer"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/bufferText"
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/minute"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Loading…
Cancel
Save