Optimize offset dialog

fongmi
FongMi 4 days ago
parent 8979b22899
commit f50ba18fb6
  1. 9
      app/src/leanback/res/layout/dialog_offset.xml
  2. 5
      app/src/main/java/com/fongmi/android/tv/ui/dialog/BaseSideSheetDialog.java
  3. 10
      app/src/main/java/com/fongmi/android/tv/ui/dialog/DanmakuSettingDialog.java
  4. 10
      app/src/main/java/com/fongmi/android/tv/ui/dialog/OffsetDialog.java
  5. 57
      app/src/main/java/com/fongmi/android/tv/ui/dialog/OffsetPanel.java
  6. 9
      app/src/mobile/res/layout/dialog_offset.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
@ -39,7 +40,9 @@
android:id="@+id/audioSection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
@ -83,7 +86,9 @@
android:id="@+id/textSection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"

@ -14,7 +14,6 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Util;
import com.google.android.material.sidesheet.SideSheetDialog;
@ -22,9 +21,7 @@ public abstract class BaseSideSheetDialog extends AppCompatDialogFragment {
protected abstract ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container);
protected int getWidth() {
return Math.min(ResUtil.dp2px(420), ResUtil.getScreenWidth() / 2);
}
protected abstract int getWidth();
@NonNull
@Override

@ -12,6 +12,7 @@ import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.databinding.DialogDanmakuSettingBinding;
import com.fongmi.android.tv.player.PlayerManager;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Util;
public final class DanmakuSettingDialog {
@ -38,7 +39,7 @@ public final class DanmakuSettingDialog {
return DialogDanmakuSettingBinding.inflate(inflater, container, false);
}
private static final class BottomSheet extends BaseBottomSheetDialog {
public static final class BottomSheet extends BaseBottomSheetDialog {
private DialogDanmakuSettingBinding binding;
private final PlayerManager player;
@ -58,7 +59,7 @@ public final class DanmakuSettingDialog {
}
}
private static final class SideSheet extends BaseSideSheetDialog {
public static final class SideSheet extends BaseSideSheetDialog {
private DialogDanmakuSettingBinding binding;
private final PlayerManager player;
@ -67,6 +68,11 @@ public final class DanmakuSettingDialog {
this.player = player;
}
@Override
protected int getWidth() {
return Math.min(ResUtil.dp2px(420), ResUtil.getScreenWidth() / 2);
}
@Override
protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return binding = DanmakuSettingDialog.inflate(inflater, container);

@ -12,6 +12,7 @@ import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.databinding.DialogOffsetBinding;
import com.fongmi.android.tv.player.PlayerManager;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Util;
public final class OffsetDialog {
@ -44,7 +45,7 @@ public final class OffsetDialog {
return DialogOffsetBinding.inflate(inflater, container, false);
}
private static final class BottomSheet extends BaseBottomSheetDialog {
public static final class BottomSheet extends BaseBottomSheetDialog {
private DialogOffsetBinding binding;
private final PlayerManager player;
@ -66,7 +67,7 @@ public final class OffsetDialog {
}
}
private static final class SideSheet extends BaseSideSheetDialog {
public static final class SideSheet extends BaseSideSheetDialog {
private DialogOffsetBinding binding;
private final PlayerManager player;
@ -77,6 +78,11 @@ public final class OffsetDialog {
this.type = type;
}
@Override
protected int getWidth() {
return Math.min(ResUtil.dp2px(320), ResUtil.getScreenWidth() / 2);
}
@Override
protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {
return binding = OffsetDialog.inflate(inflater, container);

@ -1,18 +1,20 @@
package com.fongmi.android.tv.ui.dialog;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.media3.common.C;
import com.fongmi.android.tv.databinding.DialogOffsetBinding;
import com.fongmi.android.tv.player.PlayerManager;
import com.google.android.material.slider.Slider;
import java.util.Locale;
import java.util.function.LongConsumer;
final class OffsetPanel {
private static final long OFFSET_MIN_MS = -10_000;
private static final long OFFSET_MAX_MS = 10_000;
private static final long OFFSET_STEP_MS = 100;
private final DialogOffsetBinding binding;
@ -26,43 +28,44 @@ final class OffsetPanel {
}
void bind() {
binding.audioSection.setVisibility(type == C.TRACK_TYPE_AUDIO ? View.VISIBLE : View.GONE);
binding.textSection.setVisibility(type == C.TRACK_TYPE_TEXT ? View.VISIBLE : View.GONE);
binding.audioSlider.setLabelFormatter(v -> String.format(Locale.getDefault(), "%+.1fs", v / 1000f));
binding.textSlider.setLabelFormatter(v -> String.format(Locale.getDefault(), "%+.1fs", v / 1000f));
binding.audioSlider.setValue(clamp(player.getAudioOffsetMs()));
binding.textSlider.setValue(clamp(player.getTextOffsetMs()));
setAudioValue(binding.audioSlider.getValue());
setTextValue(binding.textSlider.getValue());
binding.audioSlider.addOnChangeListener((slider, value, fromUser) -> onAudioChange(value));
binding.textSlider.addOnChangeListener((slider, value, fromUser) -> onTextChange(value));
setupOffset(binding.audioSlider, binding.audioValue, player.getAudioOffsetMs(), player::setAudioOffsetMs);
setupOffset(binding.textSlider, binding.textValue, player.getTextOffsetMs(), player::setTextOffsetMs);
binding.reset.setOnClickListener(this::onReset);
getSection().setVisibility(View.VISIBLE);
getSlider().requestFocus();
}
private void onReset(View view) {
if (type == C.TRACK_TYPE_AUDIO) binding.audioSlider.setValue(0);
if (type == C.TRACK_TYPE_TEXT) binding.textSlider.setValue(0);
private ViewGroup getSection() {
return type == C.TRACK_TYPE_AUDIO ? binding.audioSection : binding.textSection;
}
private void onAudioChange(float value) {
player.setAudioOffsetMs(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS);
setAudioValue(value);
private Slider getSlider() {
return type == C.TRACK_TYPE_AUDIO ? binding.audioSlider : binding.textSlider;
}
private void onTextChange(float value) {
player.setTextOffsetMs(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS);
setTextValue(value);
private TextView getLabel() {
return type == C.TRACK_TYPE_AUDIO ? binding.audioValue : binding.textValue;
}
private void setAudioValue(float value) {
binding.audioValue.setText(String.format(Locale.getDefault(), "%+.1fs", value / 1000f));
private void onReset(View view) {
getSlider().setValue(0);
getLabel().setText(format(0));
}
private void setTextValue(float value) {
binding.textValue.setText(String.format(Locale.getDefault(), "%+.1fs", value / 1000f));
private void setupOffset(Slider slider, TextView label, long valueMs, LongConsumer setter) {
float clamped = Math.max(slider.getValueFrom(), Math.min(slider.getValueTo(), valueMs));
slider.clearOnChangeListeners();
slider.setLabelFormatter(this::format);
slider.setValue(clamped);
label.setText(format(clamped));
slider.addOnChangeListener((source, value, fromUser) -> {
if (!fromUser) return;
setter.accept(Math.round(value / OFFSET_STEP_MS) * OFFSET_STEP_MS);
label.setText(format(value));
});
}
private float clamp(long value) {
return Math.max(OFFSET_MIN_MS, Math.min(OFFSET_MAX_MS, value));
private String format(float value) {
return String.format(Locale.getDefault(), "%+.1fs", value / 1000f);
}
}

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
@ -37,7 +38,9 @@
android:id="@+id/audioSection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
@ -79,7 +82,9 @@
android:id="@+id/textSection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"

Loading…
Cancel
Save