Skip silence setting per feed (#6910)
This commit is contained in:
parent
3c77d43e76
commit
60f3d77eb2
@ -37,6 +37,7 @@ public class VariableSpeedDialog extends BottomSheetDialogFragment {
|
|||||||
private final List<Float> selectedSpeeds;
|
private final List<Float> selectedSpeeds;
|
||||||
private PlaybackSpeedSeekBar speedSeekBar;
|
private PlaybackSpeedSeekBar speedSeekBar;
|
||||||
private Chip addCurrentSpeedChip;
|
private Chip addCurrentSpeedChip;
|
||||||
|
private CheckBox skipSilenceCheckbox;
|
||||||
|
|
||||||
public VariableSpeedDialog() {
|
public VariableSpeedDialog() {
|
||||||
DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US);
|
DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US);
|
||||||
@ -51,11 +52,13 @@ public class VariableSpeedDialog extends BottomSheetDialogFragment {
|
|||||||
@Override
|
@Override
|
||||||
public void loadMediaInfo() {
|
public void loadMediaInfo() {
|
||||||
updateSpeed(new SpeedChangedEvent(controller.getCurrentPlaybackSpeedMultiplier()));
|
updateSpeed(new SpeedChangedEvent(controller.getCurrentPlaybackSpeedMultiplier()));
|
||||||
|
updateSkipSilence(controller.getCurrentPlaybackSkipSilence());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
controller.init();
|
controller.init();
|
||||||
EventBus.getDefault().register(this);
|
EventBus.getDefault().register(this);
|
||||||
updateSpeed(new SpeedChangedEvent(controller.getCurrentPlaybackSpeedMultiplier()));
|
updateSpeed(new SpeedChangedEvent(controller.getCurrentPlaybackSpeedMultiplier()));
|
||||||
|
updateSkipSilence(controller.getCurrentPlaybackSkipSilence());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -72,6 +75,10 @@ public class VariableSpeedDialog extends BottomSheetDialogFragment {
|
|||||||
addCurrentSpeedChip.setText(String.format(Locale.getDefault(), "%1$.2f", event.getNewSpeed()));
|
addCurrentSpeedChip.setText(String.format(Locale.getDefault(), "%1$.2f", event.getNewSpeed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateSkipSilence(boolean skipSilence) {
|
||||||
|
skipSilenceCheckbox.setChecked(skipSilence);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
|
||||||
@ -97,9 +104,9 @@ public class VariableSpeedDialog extends BottomSheetDialogFragment {
|
|||||||
addCurrentSpeedChip.setCloseIconContentDescription(getString(R.string.add_preset));
|
addCurrentSpeedChip.setCloseIconContentDescription(getString(R.string.add_preset));
|
||||||
addCurrentSpeedChip.setOnClickListener(v -> addCurrentSpeed());
|
addCurrentSpeedChip.setOnClickListener(v -> addCurrentSpeed());
|
||||||
|
|
||||||
final CheckBox skipSilence = root.findViewById(R.id.skipSilence);
|
skipSilenceCheckbox = root.findViewById(R.id.skipSilence);
|
||||||
skipSilence.setChecked(UserPreferences.isSkipSilence());
|
skipSilenceCheckbox.setChecked(UserPreferences.isSkipSilence());
|
||||||
skipSilence.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
skipSilenceCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
UserPreferences.setSkipSilence(isChecked);
|
UserPreferences.setSkipSilence(isChecked);
|
||||||
controller.setSkipSilence(isChecked);
|
controller.setSkipSilence(isChecked);
|
||||||
});
|
});
|
||||||
|
@ -241,14 +241,21 @@ public class FeedSettingsFragment extends Fragment {
|
|||||||
PlaybackSpeedFeedSettingDialogBinding.inflate(getLayoutInflater());
|
PlaybackSpeedFeedSettingDialogBinding.inflate(getLayoutInflater());
|
||||||
viewBinding.seekBar.setProgressChangedListener(speed ->
|
viewBinding.seekBar.setProgressChangedListener(speed ->
|
||||||
viewBinding.currentSpeedLabel.setText(String.format(Locale.getDefault(), "%.2fx", speed)));
|
viewBinding.currentSpeedLabel.setText(String.format(Locale.getDefault(), "%.2fx", speed)));
|
||||||
float speed = feedPreferences.getFeedPlaybackSpeed();
|
|
||||||
viewBinding.useGlobalCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
viewBinding.useGlobalCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
viewBinding.seekBar.setEnabled(!isChecked);
|
viewBinding.seekBar.setEnabled(!isChecked);
|
||||||
viewBinding.seekBar.setAlpha(isChecked ? 0.4f : 1f);
|
viewBinding.seekBar.setAlpha(isChecked ? 0.4f : 1f);
|
||||||
viewBinding.currentSpeedLabel.setAlpha(isChecked ? 0.4f : 1f);
|
viewBinding.currentSpeedLabel.setAlpha(isChecked ? 0.4f : 1f);
|
||||||
|
|
||||||
|
viewBinding.skipSilenceFeed.setEnabled(!isChecked);
|
||||||
|
viewBinding.skipSilenceFeed.setAlpha(isChecked ? 0.4f : 1f);
|
||||||
});
|
});
|
||||||
viewBinding.useGlobalCheckbox.setChecked(speed == FeedPreferences.SPEED_USE_GLOBAL);
|
float speed = feedPreferences.getFeedPlaybackSpeed();
|
||||||
viewBinding.seekBar.updateSpeed(speed == FeedPreferences.SPEED_USE_GLOBAL ? 1 : speed);
|
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);
|
||||||
new MaterialAlertDialogBuilder(getContext())
|
new MaterialAlertDialogBuilder(getContext())
|
||||||
.setTitle(R.string.playback_speed)
|
.setTitle(R.string.playback_speed)
|
||||||
.setView(viewBinding.getRoot())
|
.setView(viewBinding.getRoot())
|
||||||
@ -256,9 +263,19 @@ public class FeedSettingsFragment extends Fragment {
|
|||||||
float newSpeed = viewBinding.useGlobalCheckbox.isChecked()
|
float newSpeed = viewBinding.useGlobalCheckbox.isChecked()
|
||||||
? FeedPreferences.SPEED_USE_GLOBAL : viewBinding.seekBar.getCurrentSpeed();
|
? FeedPreferences.SPEED_USE_GLOBAL : viewBinding.seekBar.getCurrentSpeed();
|
||||||
feedPreferences.setFeedPlaybackSpeed(newSpeed);
|
feedPreferences.setFeedPlaybackSpeed(newSpeed);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
feedPreferences.setFeedSkipSilence(newSkipSilence);
|
||||||
DBWriter.setFeedPreferences(feedPreferences);
|
DBWriter.setFeedPreferences(feedPreferences);
|
||||||
EventBus.getDefault().post(
|
EventBus.getDefault().post(new SpeedPresetChangedEvent(
|
||||||
new SpeedPresetChangedEvent(feedPreferences.getFeedPlaybackSpeed(), feed.getId()));
|
feedPreferences.getFeedPlaybackSpeed(),
|
||||||
|
feed.getId(), feedPreferences.getFeedSkipSilence()));
|
||||||
})
|
})
|
||||||
.setNegativeButton(R.string.cancel_label, null)
|
.setNegativeButton(R.string.cancel_label, null)
|
||||||
.show();
|
.show();
|
||||||
|
@ -34,4 +34,10 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/skipSilenceFeed"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/pref_skip_silence_title" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
@ -4,6 +4,7 @@ import android.util.Log;
|
|||||||
import de.danoeh.antennapod.model.feed.Feed;
|
import de.danoeh.antennapod.model.feed.Feed;
|
||||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
import de.danoeh.antennapod.model.playback.MediaType;
|
import de.danoeh.antennapod.model.playback.MediaType;
|
||||||
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
|
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
|
||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
@ -50,4 +51,25 @@ public final class PlaybackSpeedUtils {
|
|||||||
|
|
||||||
return playbackSpeed;
|
return playbackSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently configured skip silence for the specified media.
|
||||||
|
*/
|
||||||
|
public static FeedPreferences.SkipSilence getCurrentSkipSilencePreference(Playable media) {
|
||||||
|
FeedPreferences.SkipSilence skipSilence = FeedPreferences.SkipSilence.GLOBAL;
|
||||||
|
if (media != null) {
|
||||||
|
skipSilence = PlaybackPreferences.getCurrentlyPlayingTemporarySkipSilence();
|
||||||
|
if (skipSilence == FeedPreferences.SkipSilence.GLOBAL && media instanceof FeedMedia) {
|
||||||
|
FeedItem item = ((FeedMedia) media).getItem();
|
||||||
|
if (item != null && item.getFeed() != null && item.getFeed().getPreferences() != null) {
|
||||||
|
skipSilence = item.getFeed().getPreferences().getFeedSkipSilence();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (skipSilence == FeedPreferences.SkipSilence.GLOBAL) {
|
||||||
|
skipSilence = UserPreferences.isSkipSilence()
|
||||||
|
? FeedPreferences.SkipSilence.AGGRESSIVE : FeedPreferences.SkipSilence.OFF;
|
||||||
|
}
|
||||||
|
return skipSilence;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import android.util.Log;
|
|||||||
import de.danoeh.antennapod.core.storage.DBReader;
|
import de.danoeh.antennapod.core.storage.DBReader;
|
||||||
import de.danoeh.antennapod.event.PlayerStatusEvent;
|
import de.danoeh.antennapod.event.PlayerStatusEvent;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
import de.danoeh.antennapod.model.playback.MediaType;
|
import de.danoeh.antennapod.model.playback.MediaType;
|
||||||
import de.danoeh.antennapod.model.playback.Playable;
|
import de.danoeh.antennapod.model.playback.Playable;
|
||||||
import de.danoeh.antennapod.playback.base.PlayerStatus;
|
import de.danoeh.antennapod.playback.base.PlayerStatus;
|
||||||
@ -64,6 +65,12 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference
|
|||||||
private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED
|
private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED
|
||||||
= "de.danoeh.antennapod.preferences.temporaryPlaybackSpeed";
|
= "de.danoeh.antennapod.preferences.temporaryPlaybackSpeed";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A temporary skip silence preference which overrides the per-feed skip silence for the currently playing
|
||||||
|
* media. Considered unset if set to null;
|
||||||
|
*/
|
||||||
|
private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE
|
||||||
|
= "de.danoeh.antennapod.preferences.temporarySkipSilence";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value of PREF_CURRENTLY_PLAYING_MEDIA if no media is playing.
|
* Value of PREF_CURRENTLY_PLAYING_MEDIA if no media is playing.
|
||||||
@ -123,6 +130,11 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference
|
|||||||
return prefs.getFloat(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED, SPEED_USE_GLOBAL);
|
return prefs.getFloat(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED, SPEED_USE_GLOBAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FeedPreferences.SkipSilence getCurrentlyPlayingTemporarySkipSilence() {
|
||||||
|
return FeedPreferences.SkipSilence.fromCode(prefs.getInt(
|
||||||
|
PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE, FeedPreferences.SkipSilence.GLOBAL.code));
|
||||||
|
}
|
||||||
|
|
||||||
public static void writeNoMediaPlaying() {
|
public static void writeNoMediaPlaying() {
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
SharedPreferences.Editor editor = prefs.edit();
|
||||||
editor.putLong(PREF_CURRENTLY_PLAYING_MEDIA_TYPE, NO_MEDIA_PLAYING);
|
editor.putLong(PREF_CURRENTLY_PLAYING_MEDIA_TYPE, NO_MEDIA_PLAYING);
|
||||||
@ -170,9 +182,17 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference
|
|||||||
editor.apply();
|
editor.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void clearCurrentlyPlayingTemporaryPlaybackSpeed() {
|
public static void setCurrentlyPlayingTemporarySkipSilence(boolean skipSilence) {
|
||||||
|
SharedPreferences.Editor editor = prefs.edit();
|
||||||
|
editor.putInt(PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE, skipSilence
|
||||||
|
? FeedPreferences.SkipSilence.AGGRESSIVE.code : FeedPreferences.SkipSilence.OFF.code);
|
||||||
|
editor.apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearCurrentlyPlayingTemporaryPlaybackSettings() {
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
SharedPreferences.Editor editor = prefs.edit();
|
||||||
editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED);
|
editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED);
|
||||||
|
editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_SKIP_SILENCE);
|
||||||
editor.apply();
|
editor.apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +166,10 @@ public class ExoPlayerWrapper {
|
|||||||
return playbackParameters.speed;
|
return playbackParameters.speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getCurrentSkipSilence() {
|
||||||
|
return exoPlayer.getSkipSilenceEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
public int getDuration() {
|
public int getDuration() {
|
||||||
if (exoPlayer.getDuration() == C.TIME_UNSET) {
|
if (exoPlayer.getDuration() == C.TIME_UNSET) {
|
||||||
return Playable.INVALID_TIME;
|
return Playable.INVALID_TIME;
|
||||||
|
@ -161,7 +161,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
|
|||||||
try {
|
try {
|
||||||
callback.ensureMediaInfoLoaded(media);
|
callback.ensureMediaInfoLoaded(media);
|
||||||
callback.onMediaChanged(false);
|
callback.onMediaChanged(false);
|
||||||
setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence());
|
setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media),
|
||||||
|
PlaybackSpeedUtils.getCurrentSkipSilencePreference(media)
|
||||||
|
== FeedPreferences.SkipSilence.AGGRESSIVE);
|
||||||
if (stream) {
|
if (stream) {
|
||||||
if (playable instanceof FeedMedia) {
|
if (playable instanceof FeedMedia) {
|
||||||
FeedMedia feedMedia = (FeedMedia) playable;
|
FeedMedia feedMedia = (FeedMedia) playable;
|
||||||
@ -212,7 +214,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
|
|||||||
Log.d(TAG, "Resuming/Starting playback");
|
Log.d(TAG, "Resuming/Starting playback");
|
||||||
acquireWifiLockIfNecessary();
|
acquireWifiLockIfNecessary();
|
||||||
|
|
||||||
setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence());
|
setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media),
|
||||||
|
PlaybackSpeedUtils.getCurrentSkipSilencePreference(media)
|
||||||
|
== FeedPreferences.SkipSilence.AGGRESSIVE);
|
||||||
setVolume(1.0f, 1.0f);
|
setVolume(1.0f, 1.0f);
|
||||||
|
|
||||||
if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) {
|
if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) {
|
||||||
@ -461,6 +465,18 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
|
|||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getSkipSilence() {
|
||||||
|
boolean retVal = false;
|
||||||
|
if ((playerStatus == PlayerStatus.PLAYING
|
||||||
|
|| playerStatus == PlayerStatus.PAUSED
|
||||||
|
|| playerStatus == PlayerStatus.INITIALIZED
|
||||||
|
|| playerStatus == PlayerStatus.PREPARED)) {
|
||||||
|
retVal = mediaPlayer.getCurrentSkipSilence();
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the playback volume.
|
* Sets the playback volume.
|
||||||
* This method is executed on an internal executor service.
|
* This method is executed on an internal executor service.
|
||||||
|
@ -750,7 +750,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!playable.getIdentifier().equals(PlaybackPreferences.getCurrentlyPlayingFeedMediaId())) {
|
if (!playable.getIdentifier().equals(PlaybackPreferences.getCurrentlyPlayingFeedMediaId())) {
|
||||||
PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed();
|
PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaPlayer.playMediaObject(playable, stream, true, true);
|
mediaPlayer.playMediaObject(playable, stream, true, true);
|
||||||
@ -1047,7 +1047,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
|||||||
*/
|
*/
|
||||||
private void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
|
private void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
|
||||||
Log.d(TAG, "Playback ended");
|
Log.d(TAG, "Playback ended");
|
||||||
PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed();
|
PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSettings();
|
||||||
if (stopPlaying) {
|
if (stopPlaying) {
|
||||||
taskManager.cancelPositionSaver();
|
taskManager.cancelPositionSaver();
|
||||||
cancelPositionObserver();
|
cancelPositionObserver();
|
||||||
@ -1604,8 +1604,15 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
|||||||
if (((FeedMedia) getPlayable()).getItem().getFeed().getId() == event.getFeedId()) {
|
if (((FeedMedia) getPlayable()).getItem().getFeed().getId() == event.getFeedId()) {
|
||||||
if (event.getSpeed() == SPEED_USE_GLOBAL) {
|
if (event.getSpeed() == SPEED_USE_GLOBAL) {
|
||||||
setSpeed(UserPreferences.getPlaybackSpeed(getPlayable().getMediaType()));
|
setSpeed(UserPreferences.getPlaybackSpeed(getPlayable().getMediaType()));
|
||||||
|
setSkipSilence(UserPreferences.isSkipSilence());
|
||||||
} else {
|
} else {
|
||||||
setSpeed(event.getSpeed());
|
setSpeed(event.getSpeed());
|
||||||
|
FeedPreferences.SkipSilence skipSilence = event.getSkipSilence();
|
||||||
|
if (skipSilence == FeedPreferences.SkipSilence.GLOBAL) {
|
||||||
|
setSkipSilence(UserPreferences.isSkipSilence());
|
||||||
|
} else {
|
||||||
|
setSkipSilence(skipSilence == FeedPreferences.SkipSilence.AGGRESSIVE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1669,20 +1676,29 @@ public class PlaybackService extends MediaBrowserServiceCompat {
|
|||||||
UserPreferences.setPlaybackSpeed(speed);
|
UserPreferences.setPlaybackSpeed(speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
mediaPlayer.setPlaybackParams(speed, UserPreferences.isSkipSilence());
|
mediaPlayer.setPlaybackParams(speed, getCurrentSkipSilence());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void skipSilence(boolean skipSilence) {
|
public void setSkipSilence(boolean skipSilence) {
|
||||||
|
PlaybackPreferences.setCurrentlyPlayingTemporarySkipSilence(skipSilence);
|
||||||
|
UserPreferences.setSkipSilence(skipSilence);
|
||||||
mediaPlayer.setPlaybackParams(getCurrentPlaybackSpeed(), skipSilence);
|
mediaPlayer.setPlaybackParams(getCurrentPlaybackSpeed(), skipSilence);
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getCurrentPlaybackSpeed() {
|
public float getCurrentPlaybackSpeed() {
|
||||||
if(mediaPlayer == null) {
|
if (mediaPlayer == null) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
return mediaPlayer.getPlaybackSpeed();
|
return mediaPlayer.getPlaybackSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getCurrentSkipSilence() {
|
||||||
|
if (mediaPlayer == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return mediaPlayer.getSkipSilence();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isStartWhenPrepared() {
|
public boolean isStartWhenPrepared() {
|
||||||
return mediaPlayer.isStartWhenPrepared();
|
return mediaPlayer.isStartWhenPrepared();
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
|
|||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.event.playback.PlaybackServiceEvent;
|
import de.danoeh.antennapod.event.playback.PlaybackServiceEvent;
|
||||||
import de.danoeh.antennapod.event.playback.SpeedChangedEvent;
|
import de.danoeh.antennapod.event.playback.SpeedChangedEvent;
|
||||||
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
import de.danoeh.antennapod.model.playback.MediaType;
|
import de.danoeh.antennapod.model.playback.MediaType;
|
||||||
import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
|
import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
|
||||||
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
|
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
|
||||||
@ -407,7 +408,7 @@ public abstract class PlaybackController {
|
|||||||
|
|
||||||
public void setSkipSilence(boolean skipSilence) {
|
public void setSkipSilence(boolean skipSilence) {
|
||||||
if (playbackService != null) {
|
if (playbackService != null) {
|
||||||
playbackService.skipSilence(skipSilence);
|
playbackService.setSkipSilence(skipSilence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -419,6 +420,15 @@ public abstract class PlaybackController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getCurrentPlaybackSkipSilence() {
|
||||||
|
if (playbackService != null) {
|
||||||
|
return playbackService.getCurrentSkipSilence();
|
||||||
|
} else {
|
||||||
|
return PlaybackSpeedUtils.getCurrentSkipSilencePreference(getMedia())
|
||||||
|
== FeedPreferences.SkipSilence.AGGRESSIVE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getAudioTracks() {
|
public List<String> getAudioTracks() {
|
||||||
if (playbackService == null) {
|
if (playbackService == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
@ -1,18 +1,26 @@
|
|||||||
package de.danoeh.antennapod.event.settings;
|
package de.danoeh.antennapod.event.settings;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
|
|
||||||
public class SpeedPresetChangedEvent {
|
public class SpeedPresetChangedEvent {
|
||||||
private final float speed;
|
private final float speed;
|
||||||
|
private final FeedPreferences.SkipSilence skipSilence;
|
||||||
private final long feedId;
|
private final long feedId;
|
||||||
|
|
||||||
public SpeedPresetChangedEvent(float speed, long feedId) {
|
public SpeedPresetChangedEvent(float speed, long feedId, FeedPreferences.SkipSilence skipSilence) {
|
||||||
this.speed = speed;
|
this.speed = speed;
|
||||||
this.feedId = feedId;
|
this.feedId = feedId;
|
||||||
|
this.skipSilence = skipSilence;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getSpeed() {
|
public float getSpeed() {
|
||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FeedPreferences.SkipSilence getSkipSilence() {
|
||||||
|
return skipSilence;
|
||||||
|
}
|
||||||
|
|
||||||
public long getFeedId() {
|
public long getFeedId() {
|
||||||
return feedId;
|
return feedId;
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,25 @@ public class FeedPreferences implements Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum SkipSilence {
|
||||||
|
OFF(0), GLOBAL(1), AGGRESSIVE(2);
|
||||||
|
|
||||||
|
public final int code;
|
||||||
|
|
||||||
|
SkipSilence(int code) {
|
||||||
|
this.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SkipSilence fromCode(int code) {
|
||||||
|
for (SkipSilence s : values()) {
|
||||||
|
if (s.code == code) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GLOBAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private FeedFilter filter;
|
private FeedFilter filter;
|
||||||
private long feedID;
|
private long feedID;
|
||||||
@ -72,6 +91,7 @@ public class FeedPreferences implements Serializable {
|
|||||||
private float feedPlaybackSpeed;
|
private float feedPlaybackSpeed;
|
||||||
private int feedSkipIntro;
|
private int feedSkipIntro;
|
||||||
private int feedSkipEnding;
|
private int feedSkipEnding;
|
||||||
|
private SkipSilence feedSkipSilence;
|
||||||
private boolean showEpisodeNotification;
|
private boolean showEpisodeNotification;
|
||||||
private final Set<String> tags = new HashSet<>();
|
private final Set<String> tags = new HashSet<>();
|
||||||
|
|
||||||
@ -79,13 +99,14 @@ public class FeedPreferences implements Serializable {
|
|||||||
VolumeAdaptionSetting volumeAdaptionSetting, NewEpisodesAction newEpisodesAction,
|
VolumeAdaptionSetting volumeAdaptionSetting, NewEpisodesAction newEpisodesAction,
|
||||||
String username, String password) {
|
String username, String password) {
|
||||||
this(feedID, autoDownload, true, autoDeleteAction, volumeAdaptionSetting, username, password,
|
this(feedID, autoDownload, true, autoDeleteAction, volumeAdaptionSetting, username, password,
|
||||||
new FeedFilter(), SPEED_USE_GLOBAL, 0, 0, false, newEpisodesAction, new HashSet<>());
|
new FeedFilter(), SPEED_USE_GLOBAL, 0, 0, SkipSilence.GLOBAL,
|
||||||
|
false, newEpisodesAction, new HashSet<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated,
|
public FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated,
|
||||||
AutoDeleteAction autoDeleteAction, VolumeAdaptionSetting volumeAdaptionSetting,
|
AutoDeleteAction autoDeleteAction, VolumeAdaptionSetting volumeAdaptionSetting,
|
||||||
String username, String password, @NonNull FeedFilter filter,
|
String username, String password, @NonNull FeedFilter filter,
|
||||||
float feedPlaybackSpeed, int feedSkipIntro, int feedSkipEnding,
|
float feedPlaybackSpeed, int feedSkipIntro, int feedSkipEnding, SkipSilence feedSkipSilence,
|
||||||
boolean showEpisodeNotification, NewEpisodesAction newEpisodesAction,
|
boolean showEpisodeNotification, NewEpisodesAction newEpisodesAction,
|
||||||
Set<String> tags) {
|
Set<String> tags) {
|
||||||
this.feedID = feedID;
|
this.feedID = feedID;
|
||||||
@ -99,6 +120,7 @@ public class FeedPreferences implements Serializable {
|
|||||||
this.feedPlaybackSpeed = feedPlaybackSpeed;
|
this.feedPlaybackSpeed = feedPlaybackSpeed;
|
||||||
this.feedSkipIntro = feedSkipIntro;
|
this.feedSkipIntro = feedSkipIntro;
|
||||||
this.feedSkipEnding = feedSkipEnding;
|
this.feedSkipEnding = feedSkipEnding;
|
||||||
|
this.feedSkipSilence = feedSkipSilence;
|
||||||
this.showEpisodeNotification = showEpisodeNotification;
|
this.showEpisodeNotification = showEpisodeNotification;
|
||||||
this.newEpisodesAction = newEpisodesAction;
|
this.newEpisodesAction = newEpisodesAction;
|
||||||
this.tags.addAll(tags);
|
this.tags.addAll(tags);
|
||||||
@ -241,6 +263,14 @@ public class FeedPreferences implements Serializable {
|
|||||||
return feedSkipEnding;
|
return feedSkipEnding;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFeedSkipSilence(SkipSilence skipSilence) {
|
||||||
|
feedSkipSilence = skipSilence;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SkipSilence getFeedSkipSilence() {
|
||||||
|
return feedSkipSilence;
|
||||||
|
}
|
||||||
|
|
||||||
public Set<String> getTags() {
|
public Set<String> getTags() {
|
||||||
return tags;
|
return tags;
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,8 @@ public abstract class PlaybackServiceMediaPlayer {
|
|||||||
*/
|
*/
|
||||||
public abstract float getPlaybackSpeed();
|
public abstract float getPlaybackSpeed();
|
||||||
|
|
||||||
|
public abstract boolean getSkipSilence();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the playback volume.
|
* Sets the playback volume.
|
||||||
* This method is executed on an internal executor service.
|
* This method is executed on an internal executor service.
|
||||||
|
@ -427,6 +427,12 @@ public class CastPsmp extends PlaybackServiceMediaPlayer {
|
|||||||
return status != null ? (float) status.getPlaybackRate() : 1.0f;
|
return status != null ? (float) status.getPlaybackRate() : 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getSkipSilence() {
|
||||||
|
// Don't think this is supported
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVolume(float volumeLeft, float volumeRight) {
|
public void setVolume(float volumeLeft, float volumeRight) {
|
||||||
Log.d(TAG, "Setting the Stream volume on Remote Media Player");
|
Log.d(TAG, "Setting the Stream volume on Remote Media Player");
|
||||||
|
@ -334,6 +334,10 @@ class DBUpgrader {
|
|||||||
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
||||||
+ " ADD COLUMN " + PodDBAdapter.KEY_NEW_EPISODES_ACTION + " INTEGER DEFAULT 0");
|
+ " ADD COLUMN " + PodDBAdapter.KEY_NEW_EPISODES_ACTION + " INTEGER DEFAULT 0");
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 3040000) {
|
||||||
|
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
||||||
|
+ " ADD COLUMN " + PodDBAdapter.KEY_FEED_SKIP_SILENCE + " INTEGER");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ public class PodDBAdapter {
|
|||||||
|
|
||||||
private static final String TAG = "PodDBAdapter";
|
private static final String TAG = "PodDBAdapter";
|
||||||
public static final String DATABASE_NAME = "Antennapod.db";
|
public static final String DATABASE_NAME = "Antennapod.db";
|
||||||
public static final int VERSION = 3010000;
|
public static final int VERSION = 3040000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum number of arguments for IN-operator.
|
* Maximum number of arguments for IN-operator.
|
||||||
@ -113,6 +113,7 @@ public class PodDBAdapter {
|
|||||||
public static final String KEY_EXCLUDE_FILTER = "exclude_filter";
|
public static final String KEY_EXCLUDE_FILTER = "exclude_filter";
|
||||||
public static final String KEY_MINIMAL_DURATION_FILTER = "minimal_duration_filter";
|
public static final String KEY_MINIMAL_DURATION_FILTER = "minimal_duration_filter";
|
||||||
public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed";
|
public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed";
|
||||||
|
public static final String KEY_FEED_SKIP_SILENCE = "feed_skip_silence";
|
||||||
public static final String KEY_FEED_SKIP_INTRO = "feed_skip_intro";
|
public static final String KEY_FEED_SKIP_INTRO = "feed_skip_intro";
|
||||||
public static final String KEY_FEED_SKIP_ENDING = "feed_skip_ending";
|
public static final String KEY_FEED_SKIP_ENDING = "feed_skip_ending";
|
||||||
public static final String KEY_FEED_TAGS = "tags";
|
public static final String KEY_FEED_TAGS = "tags";
|
||||||
@ -155,6 +156,7 @@ public class PodDBAdapter {
|
|||||||
+ KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0,"
|
+ KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0,"
|
+ KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + ","
|
+ KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + ","
|
||||||
|
+ KEY_FEED_SKIP_SILENCE + " INTEGER DEFAULT " + FeedPreferences.SkipSilence.GLOBAL.code + ","
|
||||||
+ KEY_FEED_VOLUME_ADAPTION + " INTEGER DEFAULT 0,"
|
+ KEY_FEED_VOLUME_ADAPTION + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_FEED_TAGS + " TEXT,"
|
+ KEY_FEED_TAGS + " TEXT,"
|
||||||
+ KEY_FEED_SKIP_INTRO + " INTEGER DEFAULT 0,"
|
+ KEY_FEED_SKIP_INTRO + " INTEGER DEFAULT 0,"
|
||||||
@ -307,6 +309,7 @@ public class PodDBAdapter {
|
|||||||
+ TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER + ", "
|
||||||
+ TABLE_NAME_FEEDS + "." + KEY_MINIMAL_DURATION_FILTER + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_MINIMAL_DURATION_FILTER + ", "
|
||||||
+ TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED + ", "
|
||||||
|
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_SILENCE + ", "
|
||||||
+ TABLE_NAME_FEEDS + "." + KEY_FEED_TAGS + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_FEED_TAGS + ", "
|
||||||
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_INTRO + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_INTRO + ", "
|
||||||
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_ENDING + ", "
|
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_ENDING + ", "
|
||||||
@ -456,6 +459,7 @@ public class PodDBAdapter {
|
|||||||
values.put(KEY_EXCLUDE_FILTER, prefs.getFilter().getExcludeFilterRaw());
|
values.put(KEY_EXCLUDE_FILTER, prefs.getFilter().getExcludeFilterRaw());
|
||||||
values.put(KEY_MINIMAL_DURATION_FILTER, prefs.getFilter().getMinimalDurationFilter());
|
values.put(KEY_MINIMAL_DURATION_FILTER, prefs.getFilter().getMinimalDurationFilter());
|
||||||
values.put(KEY_FEED_PLAYBACK_SPEED, prefs.getFeedPlaybackSpeed());
|
values.put(KEY_FEED_PLAYBACK_SPEED, prefs.getFeedPlaybackSpeed());
|
||||||
|
values.put(KEY_FEED_SKIP_SILENCE, prefs.getFeedSkipSilence().code);
|
||||||
values.put(KEY_FEED_TAGS, prefs.getTagsAsString());
|
values.put(KEY_FEED_TAGS, prefs.getTagsAsString());
|
||||||
values.put(KEY_FEED_SKIP_INTRO, prefs.getFeedSkipIntro());
|
values.put(KEY_FEED_SKIP_INTRO, prefs.getFeedSkipIntro());
|
||||||
values.put(KEY_FEED_SKIP_ENDING, prefs.getFeedSkipEnding());
|
values.put(KEY_FEED_SKIP_ENDING, prefs.getFeedSkipEnding());
|
||||||
|
@ -31,6 +31,7 @@ public abstract class FeedPreferencesCursorMapper {
|
|||||||
int indexExcludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EXCLUDE_FILTER);
|
int indexExcludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EXCLUDE_FILTER);
|
||||||
int indexMinimalDurationFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MINIMAL_DURATION_FILTER);
|
int indexMinimalDurationFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MINIMAL_DURATION_FILTER);
|
||||||
int indexFeedPlaybackSpeed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_PLAYBACK_SPEED);
|
int indexFeedPlaybackSpeed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_PLAYBACK_SPEED);
|
||||||
|
int indexFeedSkipSilence = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_SILENCE);
|
||||||
int indexAutoSkipIntro = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_INTRO);
|
int indexAutoSkipIntro = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_INTRO);
|
||||||
int indexAutoSkipEnding = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_ENDING);
|
int indexAutoSkipEnding = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_ENDING);
|
||||||
int indexEpisodeNotification = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EPISODE_NOTIFICATION);
|
int indexEpisodeNotification = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EPISODE_NOTIFICATION);
|
||||||
@ -52,6 +53,8 @@ public abstract class FeedPreferencesCursorMapper {
|
|||||||
float feedPlaybackSpeed = cursor.getFloat(indexFeedPlaybackSpeed);
|
float feedPlaybackSpeed = cursor.getFloat(indexFeedPlaybackSpeed);
|
||||||
int feedAutoSkipIntro = cursor.getInt(indexAutoSkipIntro);
|
int feedAutoSkipIntro = cursor.getInt(indexAutoSkipIntro);
|
||||||
int feedAutoSkipEnding = cursor.getInt(indexAutoSkipEnding);
|
int feedAutoSkipEnding = cursor.getInt(indexAutoSkipEnding);
|
||||||
|
FeedPreferences.SkipSilence feedSkipSilence =
|
||||||
|
FeedPreferences.SkipSilence.fromCode(cursor.getInt(indexFeedSkipSilence));
|
||||||
FeedPreferences.NewEpisodesAction feedNewEpisodesAction =
|
FeedPreferences.NewEpisodesAction feedNewEpisodesAction =
|
||||||
FeedPreferences.NewEpisodesAction.fromCode(cursor.getInt(indexNewEpisodesAction));
|
FeedPreferences.NewEpisodesAction.fromCode(cursor.getInt(indexNewEpisodesAction));
|
||||||
boolean showNotification = cursor.getInt(indexEpisodeNotification) > 0;
|
boolean showNotification = cursor.getInt(indexEpisodeNotification) > 0;
|
||||||
@ -59,6 +62,7 @@ public abstract class FeedPreferencesCursorMapper {
|
|||||||
if (TextUtils.isEmpty(tagsString)) {
|
if (TextUtils.isEmpty(tagsString)) {
|
||||||
tagsString = FeedPreferences.TAG_ROOT;
|
tagsString = FeedPreferences.TAG_ROOT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new FeedPreferences(feedId,
|
return new FeedPreferences(feedId,
|
||||||
autoDownload,
|
autoDownload,
|
||||||
autoRefresh,
|
autoRefresh,
|
||||||
@ -70,6 +74,7 @@ public abstract class FeedPreferencesCursorMapper {
|
|||||||
feedPlaybackSpeed,
|
feedPlaybackSpeed,
|
||||||
feedAutoSkipIntro,
|
feedAutoSkipIntro,
|
||||||
feedAutoSkipEnding,
|
feedAutoSkipEnding,
|
||||||
|
feedSkipSilence,
|
||||||
showNotification,
|
showNotification,
|
||||||
feedNewEpisodesAction,
|
feedNewEpisodesAction,
|
||||||
new HashSet<>(Arrays.asList(tagsString.split(FeedPreferences.TAG_SEPARATOR))));
|
new HashSet<>(Arrays.asList(tagsString.split(FeedPreferences.TAG_SEPARATOR))));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user