From 34670f6efe69720ef0c9a4f29fa8e3fa80dbe5ac Mon Sep 17 00:00:00 2001 From: Martin Nowak Date: Mon, 29 Jan 2024 22:42:46 +0100 Subject: [PATCH] fix #4229 - configurable skip silence - followup feed-specific skip silence config (#6910) - toggle buttons to configure - medium 300ms gap - aggressive 50ms gap --- .../preferences/FeedSettingsFragment.java | 25 +++++-- .../screen/playback/VariableSpeedDialog.java | 39 ++++++++--- .../playback_speed_feed_setting_dialog.xml | 34 ++++++++- .../main/res/layout/speed_select_dialog.xml | 39 ++++++++++- .../model/feed/FeedPreferences.java | 2 +- .../base/PlaybackServiceMediaPlayer.java | 5 +- .../antennapod/playback/cast/CastPsmp.java | 7 +- .../playback/service/PlaybackController.java | 7 +- .../playback/service/PlaybackService.java | 10 +-- .../service/internal/ExoPlayerWrapper.java | 70 +++++++++++++++++-- .../playback/service/internal/LocalPSMP.java | 15 ++-- .../preferences/PlaybackPreferences.java | 5 +- .../storage/preferences/UserPreferences.java | 16 +++-- .../ui/episodes/PlaybackSpeedUtils.java | 3 +- 14 files changed, 217 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/preferences/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/preferences/FeedSettingsFragment.java index 4438f80cc9..1286595c6a 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/preferences/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/preferences/FeedSettingsFragment.java @@ -243,16 +243,25 @@ private void setupPlaybackSpeedPreference() { viewBinding.seekBar.setAlpha(isChecked ? 0.4f : 1f); viewBinding.currentSpeedLabel.setAlpha(isChecked ? 0.4f : 1f); - viewBinding.skipSilenceFeed.setEnabled(!isChecked); - viewBinding.skipSilenceFeed.setAlpha(isChecked ? 0.4f : 1f); + viewBinding.skipSilence.setEnabled(!isChecked); + viewBinding.skipSilence.setAlpha(isChecked ? 0.4f : 1f); }); float speed = feedPreferences.getFeedPlaybackSpeed(); FeedPreferences.SkipSilence skipSilence = feedPreferences.getFeedSkipSilence(); boolean isGlobal = speed == FeedPreferences.SPEED_USE_GLOBAL; viewBinding.useGlobalCheckbox.setChecked(isGlobal); viewBinding.seekBar.updateSpeed(isGlobal ? 1 : speed); - viewBinding.skipSilenceFeed.setChecked(!isGlobal - && skipSilence == FeedPreferences.SkipSilence.AGGRESSIVE); + if (isGlobal) { + viewBinding.skipSilence.clearChecked(); + } else { + int id = View.NO_ID; + switch (skipSilence) { + case OFF: id = R.id.skipSilenceOff; break; + case MEDIUM: id = R.id.skipSilenceMedium; break; + case AGGRESSIVE: id = R.id.skipSilenceAggressive; break; + } + viewBinding.skipSilence.check(id); + } new MaterialAlertDialogBuilder(getContext()) .setTitle(R.string.playback_speed) .setView(viewBinding.getRoot()) @@ -263,10 +272,12 @@ private void setupPlaybackSpeedPreference() { FeedPreferences.SkipSilence newSkipSilence; if (viewBinding.useGlobalCheckbox.isChecked()) { newSkipSilence = FeedPreferences.SkipSilence.GLOBAL; - } else if (viewBinding.skipSilenceFeed.isChecked()) { - newSkipSilence = FeedPreferences.SkipSilence.AGGRESSIVE; } else { - newSkipSilence = FeedPreferences.SkipSilence.OFF; + final int id = viewBinding.skipSilence.getCheckedButtonId(); + if (id == R.id.skipSilenceOff) newSkipSilence = FeedPreferences.SkipSilence.OFF; + else if (id == R.id.skipSilenceMedium) newSkipSilence = FeedPreferences.SkipSilence.MEDIUM; + else if (id == R.id.skipSilenceAggressive) newSkipSilence = FeedPreferences.SkipSilence.AGGRESSIVE; + else newSkipSilence = FeedPreferences.SkipSilence.GLOBAL; } feedPreferences.setFeedSkipSilence(newSkipSilence); DBWriter.setFeedPreferences(feedPreferences); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/playback/VariableSpeedDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/playback/VariableSpeedDialog.java index 8343e933a4..efc8c73a1e 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/playback/VariableSpeedDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/playback/VariableSpeedDialog.java @@ -7,16 +7,19 @@ import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.google.android.material.button.MaterialButtonToggleGroup; import com.google.android.material.chip.Chip; import com.google.android.material.snackbar.Snackbar; import de.danoeh.antennapod.R; import de.danoeh.antennapod.event.playback.SpeedChangedEvent; +import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.playback.service.PlaybackController; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.view.ItemOffsetDecoration; @@ -36,7 +39,7 @@ public class VariableSpeedDialog extends BottomSheetDialogFragment { private final List selectedSpeeds; private PlaybackSpeedSeekBar speedSeekBar; private Chip addCurrentSpeedChip; - private CheckBox skipSilenceCheckbox; + private MaterialButtonToggleGroup skipSilenceToggleGroup; public VariableSpeedDialog() { DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US); @@ -74,8 +77,28 @@ public void updateSpeed(SpeedChangedEvent event) { addCurrentSpeedChip.setText(String.format(Locale.getDefault(), "%1$.2f", event.getNewSpeed())); } - public void updateSkipSilence(boolean skipSilence) { - skipSilenceCheckbox.setChecked(skipSilence); + public void updateSkipSilence(FeedPreferences.SkipSilence skipSilence) { + int id = View.NO_ID; + switch (skipSilence) { + case OFF: id = R.id.skipSilenceOff; break; + case MEDIUM: id = R.id.skipSilenceMedium; break; + case AGGRESSIVE: id = R.id.skipSilenceAggressive; break; + } + skipSilenceToggleGroup.check(id); + } + + private void onSkipSilenceChanged(MaterialButtonToggleGroup group, int checkedId, boolean isChecked) { + FeedPreferences.SkipSilence opt; + final int id = group.getCheckedButtonId(); + if (id == R.id.skipSilenceOff) opt = FeedPreferences.SkipSilence.OFF; + else if (id == R.id.skipSilenceMedium) opt = FeedPreferences.SkipSilence.MEDIUM; + else if (id == R.id.skipSilenceAggressive) opt = FeedPreferences.SkipSilence.AGGRESSIVE; + else opt = FeedPreferences.SkipSilence.GLOBAL; + if (UserPreferences.getSkipSilence() != opt) + UserPreferences.setSkipSilence(opt); + if (controller != null) { + controller.setSkipSilence(opt); + } } @Nullable @@ -104,12 +127,10 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c addCurrentSpeedChip.setCloseIconContentDescription(getString(R.string.add_preset)); addCurrentSpeedChip.setOnClickListener(v -> addCurrentSpeed()); - skipSilenceCheckbox = root.findViewById(R.id.skipSilence); - skipSilenceCheckbox.setChecked(UserPreferences.isSkipSilence()); - skipSilenceCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> { - UserPreferences.setSkipSilence(isChecked); - controller.setSkipSilence(isChecked); - }); + skipSilenceToggleGroup = root.findViewById(R.id.skipSilence); + skipSilenceToggleGroup.addOnButtonCheckedListener( + (group, checkedId, isChecked) -> onSkipSilenceChanged(group, checkedId, isChecked)); + updateSkipSilence(UserPreferences.getSkipSilence()); return root; } diff --git a/app/src/main/res/layout/playback_speed_feed_setting_dialog.xml b/app/src/main/res/layout/playback_speed_feed_setting_dialog.xml index 317f860931..1e09db8d3a 100644 --- a/app/src/main/res/layout/playback_speed_feed_setting_dialog.xml +++ b/app/src/main/res/layout/playback_speed_feed_setting_dialog.xml @@ -34,10 +34,38 @@ - + android:weightSum="3" + app:singleSelection="true"> + +