diff options
author | Jonas Kalderstam <jonas@cowboyprogrammer.org> | 2019-09-12 00:50:07 +0200 |
---|---|---|
committer | Jonas Kalderstam <jonas@cowboyprogrammer.org> | 2019-09-12 00:50:07 +0200 |
commit | 4054c330acce74976a3e42e7ccc1f0d1dcb69c14 (patch) | |
tree | 5a04d66cbb52b26889f5d893f022845b2604eaf6 /app/src/main/java/de/danoeh/antennapod | |
parent | ada0101b0754cf4b34a1719f90f0b20571dab8db (diff) | |
download | AntennaPod-4054c330acce74976a3e42e7ccc1f0d1dcb69c14.zip |
Added per-feed playback speed setting
Fixes #375
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod')
5 files changed, 89 insertions, 6 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java index 2321a3602..222923448 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -24,6 +24,9 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { private final AtomicBoolean isSetup = new AtomicBoolean(false); + // Used to work around race condition in updating the controller speed and receiving the callback that it has changed + private float playbackSpeed = -1; + @Override protected void onResume() { super.onResume(); @@ -78,7 +81,10 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { } float speed = 1.0f; if(controller.canSetPlaybackSpeed()) { - speed = UserPreferences.getPlaybackSpeed(); + speed = playbackSpeed; + if (speed == -1) { + speed = getPlaybackSpeedForMedia(); + } } String speedStr = new DecimalFormat("0.00x").format(speed); butPlaybackSpeed.setText(speedStr); @@ -102,7 +108,13 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { String[] availableSpeeds = UserPreferences.getPlaybackSpeedArray(); DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US); format.setDecimalSeparator('.'); - String currentSpeed = new DecimalFormat("0.00", format).format(UserPreferences.getPlaybackSpeed()); + + float currentSpeedValue = controller.getCurrentPlaybackSpeedMultiplier(); + if (currentSpeedValue == -1) { + currentSpeedValue = getPlaybackSpeedForMedia(); + } + + String currentSpeed = new DecimalFormat("0.00", format).format(currentSpeedValue); // Provide initial value in case the speed list has changed // out from under us @@ -124,8 +136,9 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { break; } } + playbackSpeed = Float.parseFloat(newSpeed); UserPreferences.setPlaybackSpeed(newSpeed); - controller.setPlaybackSpeed(Float.parseFloat(newSpeed)); + controller.setPlaybackSpeed(playbackSpeed); onPositionObserverUpdate(); } else { VariableSpeedDialog.showGetPluginDialog(this); diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 52497a27f..9f364fec1 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -872,4 +872,17 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements } } } + + protected float getPlaybackSpeedForMedia() { + if (controller != null) { + Playable media = controller.getMedia(); + boolean isFeedMedia = media instanceof FeedMedia; + + if (isFeedMedia) { + return ((FeedMedia) media).getFeedPlaybackSpeed(); + } + } + + return UserPreferences.getPlaybackSpeed(); + } } diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java index e8c7520b7..4c52e7c75 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -8,14 +8,18 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.SeekBar; import android.widget.TextView; + import com.afollestad.materialdialogs.MaterialDialog; + +import java.util.Locale; + import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.Converter; +import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; -import java.util.Locale; - public class PlaybackControlsDialog extends DialogFragment { private static final float PLAYBACK_SPEED_STEP = 0.05f; private static final float DEFAULT_MIN_PLAYBACK_SPEED = 0.5f; @@ -209,6 +213,16 @@ public class PlaybackControlsDialog extends DialogFragment { if (isPlayingVideo) { return UserPreferences.getVideoPlaybackSpeed(); } + + if (controller != null) { + Playable media = controller.getMedia(); + boolean isFeedMedia = media instanceof FeedMedia; + + if (isFeedMedia) { + return ((FeedMedia) media).getFeedPlaybackSpeed(); + } + } + return UserPreferences.getPlaybackSpeed(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java index 4fb3d90f5..56d58d1db 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -22,6 +22,7 @@ import static de.danoeh.antennapod.activity.FeedSettingsActivity.EXTRA_FEED_ID; public class FeedSettingsFragment extends PreferenceFragmentCompat { private static final CharSequence PREF_EPISODE_FILTER = "episodeFilter"; + private static final String PREF_FEED_PLAYBACK_SPEED = "feedPlaybackSpeed"; private Feed feed; private FeedPreferences feedPreferences; @@ -40,12 +41,41 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { setupAutoDeletePreference(); setupAuthentificationPreference(); setupEpisodeFilterPreference(); + setupPlaybackSpeedPreference(); updateAutoDeleteSummary(); updateAutoDownloadEnabled(); + updatePlaybackSpeedPreference(); }).dispose(); } + private void setupPlaybackSpeedPreference() { + ListPreference feedPlaybackSpeedPreference = (ListPreference) findPreference(PREF_FEED_PLAYBACK_SPEED); + + String[] speeds = UserPreferences.getPlaybackSpeedArray(); + + String[] values = new String[speeds.length + 1]; + values[0] = "global"; + + String[] entries = new String[speeds.length + 1]; + entries[0] = getString(R.string.feed_auto_download_global); + + for (int i = 0; i < speeds.length; i++) { + values[i + 1] = speeds[i]; + entries[i + 1] = speeds[i]; + } + + feedPlaybackSpeedPreference.setEntryValues(values); + feedPlaybackSpeedPreference.setEntries(entries); + + feedPlaybackSpeedPreference.setOnPreferenceChangeListener((preference, newValue) -> { + feedPreferences.setFeedPlaybackSpeed((String) newValue); + feed.savePreferences(); + updatePlaybackSpeedPreference(); + return false; + }); + } + private void setupEpisodeFilterPreference() { findPreference(PREF_EPISODE_FILTER).setOnPreferenceClickListener(preference -> { new EpisodeFilterDialog(getContext(), feedPreferences.getFilter()) { @@ -95,6 +125,19 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { }); } + private void updatePlaybackSpeedPreference() { + ListPreference feedPlaybackSpeedPreference = (ListPreference) findPreference(PREF_FEED_PLAYBACK_SPEED); + + String summary = feedPreferences.getFeedPlaybackSpeed(); + + feedPlaybackSpeedPreference.setValue(summary); + if (summary.equals("global")) { + summary = getString(R.string.feed_auto_download_global); + } + + feedPlaybackSpeedPreference.setSummary(summary); + } + private void updateAutoDeleteSummary() { ListPreference autoDeletePreference = (ListPreference) findPreference("autoDelete"); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 9763f8f2d..902708e9a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -598,8 +598,8 @@ public class QueueFragment extends Fragment { String info = queue.size() + getString(R.string.episodes_suffix); if(queue.size() > 0) { long timeLeft = 0; - float playbackSpeed = UserPreferences.getPlaybackSpeed(); for(FeedItem item : queue) { + float playbackSpeed = item.getFeedPlaybackSpeed(); if(item.getMedia() != null) { timeLeft += (long) ((item.getMedia().getDuration() - item.getMedia().getPosition()) |