From 4054c330acce74976a3e42e7ccc1f0d1dcb69c14 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Thu, 12 Sep 2019 00:50:07 +0200 Subject: [PATCH 01/22] Added per-feed playback speed setting Fixes #375 --- .../activity/AudioplayerActivity.java | 19 ++++++-- .../activity/MediaplayerActivity.java | 13 ++++++ .../dialog/PlaybackControlsDialog.java | 22 ++++++++-- .../fragment/FeedSettingsFragment.java | 43 +++++++++++++++++++ .../antennapod/fragment/QueueFragment.java | 2 +- app/src/main/res/xml/feed_settings.xml | 4 ++ .../danoeh/antennapod/core/feed/FeedItem.java | 13 ++++++ .../antennapod/core/feed/FeedMedia.java | 12 ++++++ .../antennapod/core/feed/FeedPreferences.java | 38 ++++++++++++++-- .../core/service/playback/LocalPSMP.java | 3 ++ .../antennapod/core/storage/DBUpgrader.java | 4 ++ .../antennapod/core/storage/PodDBAdapter.java | 10 +++-- 12 files changed, 169 insertions(+), 14 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 de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.util.Converter; -import de.danoeh.antennapod.core.util.playback.PlaybackController; 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; + 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()) diff --git a/app/src/main/res/xml/feed_settings.xml b/app/src/main/res/xml/feed_settings.xml index 5fd6b2038..16e008e0d 100644 --- a/app/src/main/res/xml/feed_settings.xml +++ b/app/src/main/res/xml/feed_settings.xml @@ -7,6 +7,10 @@ android:title="@string/keep_updated" android:summary="@string/keep_updated_summary"/> + + 0; @@ -62,7 +65,8 @@ public class FeedPreferences { String password = cursor.getString(indexPassword); String includeFilter = cursor.getString(indexIncludeFilter); String excludeFilter = cursor.getString(indexExcludeFilter); - return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, username, password, new FeedFilter(includeFilter, excludeFilter)); + String feedPlaybackSpeed = cursor.getString(indexFeedPlaybackSpeed); + return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, username, password, new FeedFilter(includeFilter, excludeFilter), feedPlaybackSpeed); } /** @@ -175,4 +179,32 @@ public class FeedPreferences { public void setPassword(String password) { this.password = password; } + + public float getCurrentPlaybackSpeed() { + float speed = 0.0f; + + if (!"global".equals(feedPlaybackSpeed)) { + try { + speed = Float.parseFloat(getFeedPlaybackSpeed()); + } catch (NumberFormatException e) { + Log.e(TAG, Log.getStackTraceString(e)); + setFeedPlaybackSpeed("global"); + } + } + + // Either global or error happened + if (speed == 0.0f) { + speed = UserPreferences.getPlaybackSpeed(); + } + + return speed; + } + + public String getFeedPlaybackSpeed() { + return feedPlaybackSpeed; + } + + public void setFeedPlaybackSpeed(String playbackSpeed) { + feedPlaybackSpeed = playbackSpeed; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 5177fa6be..c2c503abe 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; @@ -306,6 +307,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { acquireWifiLockIfNecessary(); if (media.getMediaType() == MediaType.VIDEO) { setPlaybackParams(UserPreferences.getVideoPlaybackSpeed(), UserPreferences.isSkipSilence()); + } else if (media instanceof FeedMedia) { + setPlaybackParams(((FeedMedia) media).getFeedPlaybackSpeed(), UserPreferences.isSkipSilence()); } else { setPlaybackParams(UserPreferences.getPlaybackSpeed(), UserPreferences.isSkipSilence()); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index 306f8d104..ddc8e770a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -288,6 +288,10 @@ class DBUpgrader { db.execSQL("DROP TABLE " + PodDBAdapter.TABLE_NAME_FEED_IMAGES); } + if (oldVersion < 1070306) { + db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " TEXT"); + } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 13ea9daf0..63c036b6e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -114,6 +114,7 @@ public class PodDBAdapter { public static final String KEY_LAST_PLAYED_TIME = "last_played_time"; public static final String KEY_INCLUDE_FILTER = "include_filter"; public static final String KEY_EXCLUDE_FILTER = "exclude_filter"; + public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed"; // Table names static final String TABLE_NAME_FEEDS = "Feeds"; @@ -146,7 +147,8 @@ public class PodDBAdapter { + KEY_NEXT_PAGE_LINK + " TEXT," + KEY_HIDE + " TEXT," + 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 + " TEXT)"; private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE " + TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE @@ -243,7 +245,8 @@ public class PodDBAdapter { TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED, TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION, TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER, - TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER + TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER, + TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED }; /** @@ -408,6 +411,7 @@ public class PodDBAdapter { values.put(KEY_PASSWORD, prefs.getPassword()); values.put(KEY_INCLUDE_FILTER, prefs.getFilter().getIncludeFilter()); values.put(KEY_EXCLUDE_FILTER, prefs.getFilter().getExcludeFilter()); + values.put(KEY_FEED_PLAYBACK_SPEED, prefs.getFeedPlaybackSpeed()); db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(prefs.getFeedID())}); } @@ -1452,7 +1456,7 @@ public class PodDBAdapter { */ private static class PodDBHelper extends SQLiteOpenHelper { - private static final int VERSION = 1060596; + private static final int VERSION = 1070306; private final Context context; From 6b1a7a9162cb27f0b2aa3e550069945b6e0d95f3 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Thu, 12 Sep 2019 10:57:16 +0200 Subject: [PATCH 02/22] Fixed playback speed issues when switching to next media Fixes some issues related to the playback speed when playback was completed or playback was paused and the app went away for awhile. Now a media item which is "in progress" will remember its playback speed so that it can be restored properly. The per-feed-media speed is cleared once playback finishes, either by reaching the end or by the user starting to play something different. --- .../activity/AudioplayerActivity.java | 22 ++++++++------ .../activity/MediaplayerActivity.java | 2 +- .../dialog/PlaybackControlsDialog.java | 2 +- .../antennapod/core/feed/FeedMedia.java | 30 ++++++++++++++++--- .../antennapod/core/feed/FeedPreferences.java | 1 - .../core/service/playback/LocalPSMP.java | 2 +- .../antennapod/core/storage/DBUpgrader.java | 2 ++ .../antennapod/core/storage/DBWriter.java | 14 +++++++++ .../antennapod/core/storage/PodDBAdapter.java | 19 +++++++++++- 9 files changed, 76 insertions(+), 18 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 222923448..5e81295b1 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -11,9 +11,11 @@ import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.dialog.VariableSpeedDialog; /** @@ -24,9 +26,6 @@ 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(); @@ -81,10 +80,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { } float speed = 1.0f; if(controller.canSetPlaybackSpeed()) { - speed = playbackSpeed; - if (speed == -1) { - speed = getPlaybackSpeedForMedia(); - } + speed = getPlaybackSpeedForMedia(); } String speedStr = new DecimalFormat("0.00x").format(speed); butPlaybackSpeed.setText(speedStr); @@ -136,9 +132,10 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { break; } } - playbackSpeed = Float.parseFloat(newSpeed); + + storeNewMediaPlaybackSpeed(newSpeed); UserPreferences.setPlaybackSpeed(newSpeed); - controller.setPlaybackSpeed(playbackSpeed); + controller.setPlaybackSpeed(Float.parseFloat(newSpeed)); onPositionObserverUpdate(); } else { VariableSpeedDialog.showGetPluginDialog(this); @@ -151,4 +148,11 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { butPlaybackSpeed.setVisibility(View.VISIBLE); } } + + private void storeNewMediaPlaybackSpeed(String speed) { + Playable media = controller.getMedia(); + if (media instanceof FeedMedia) { + ((FeedMedia) media).updateLastPlaybackSpeed(speed); + } + } } 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 9f364fec1..b6697ef52 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -879,7 +879,7 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements boolean isFeedMedia = media instanceof FeedMedia; if (isFeedMedia) { - return ((FeedMedia) media).getFeedPlaybackSpeed(); + return ((FeedMedia) media).getMediaPlaybackSpeed(); } } 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 4c52e7c75..86720f40a 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -219,7 +219,7 @@ public class PlaybackControlsDialog extends DialogFragment { boolean isFeedMedia = media instanceof FeedMedia; if (isFeedMedia) { - return ((FeedMedia) media).getFeedPlaybackSpeed(); + return ((FeedMedia) media).getMediaPlaybackSpeed(); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 192fa0c2d..46795bc11 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -55,6 +55,7 @@ public class FeedMedia extends FeedFile implements Playable { private Date playbackCompletionDate; private int startPosition = -1; private int playedDurationWhenStarted; + private String lastPlaybackSpeed = null; // if null: unknown, will be checked private Boolean hasEmbeddedPicture; @@ -91,10 +92,11 @@ public class FeedMedia extends FeedFile implements Playable { private FeedMedia(long id, FeedItem item, int duration, int position, long size, String mime_type, String file_url, String download_url, boolean downloaded, Date playbackCompletionDate, int played_duration, - Boolean hasEmbeddedPicture, long lastPlayedTime) { + Boolean hasEmbeddedPicture, long lastPlayedTime, String lastPlaybackSpeed) { this(id, item, duration, position, size, mime_type, file_url, download_url, downloaded, playbackCompletionDate, played_duration, lastPlayedTime); this.hasEmbeddedPicture = hasEmbeddedPicture; + this.lastPlaybackSpeed = lastPlaybackSpeed; } public static FeedMedia fromCursor(Cursor cursor) { @@ -109,6 +111,7 @@ public class FeedMedia extends FeedFile implements Playable { int indexDownloaded = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED); int indexPlayedDuration = cursor.getColumnIndex(PodDBAdapter.KEY_PLAYED_DURATION); int indexLastPlayedTime = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_PLAYED_TIME); + int indexLastPlaybackSpeed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_PLAYBACK_SPEED); long mediaId = cursor.getLong(indexId); Date playbackCompletionDate = null; @@ -143,7 +146,8 @@ public class FeedMedia extends FeedFile implements Playable { playbackCompletionDate, cursor.getInt(indexPlayedDuration), hasEmbeddedPicture, - cursor.getLong(indexLastPlayedTime) + cursor.getLong(indexLastPlayedTime), + cursor.getString(indexLastPlaybackSpeed) ); } @@ -624,15 +628,33 @@ public class FeedMedia extends FeedFile implements Playable { return super.equals(o); } + public String getLastPlaybackSpeed() { + return lastPlaybackSpeed; + } + + public void updateLastPlaybackSpeed(String newSpeed) { + lastPlaybackSpeed = newSpeed; + DBWriter.setFeedMediaPlaybackInformation(this); + } + /** * - * @return playback speed for this feed, or the global setting if no feed-specific setting + * @return the current playback speed for the media, or the feed's configured speed */ - public float getFeedPlaybackSpeed() { + public float getMediaPlaybackSpeed() { + if (lastPlaybackSpeed != null) { + try { + return Float.parseFloat(lastPlaybackSpeed); + } catch (NumberFormatException e) { + lastPlaybackSpeed = null; + } + } + FeedItem item = getItem(); if (item != null) { return item.getFeedPlaybackSpeed(); } + return UserPreferences.getPlaybackSpeed(); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java index 7864f51bd..d7d173e19 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java @@ -187,7 +187,6 @@ public class FeedPreferences { try { speed = Float.parseFloat(getFeedPlaybackSpeed()); } catch (NumberFormatException e) { - Log.e(TAG, Log.getStackTraceString(e)); setFeedPlaybackSpeed("global"); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index c2c503abe..abb5d83bd 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -308,7 +308,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (media.getMediaType() == MediaType.VIDEO) { setPlaybackParams(UserPreferences.getVideoPlaybackSpeed(), UserPreferences.isSkipSilence()); } else if (media instanceof FeedMedia) { - setPlaybackParams(((FeedMedia) media).getFeedPlaybackSpeed(), UserPreferences.isSkipSilence()); + setPlaybackParams(((FeedMedia) media).getMediaPlaybackSpeed(), UserPreferences.isSkipSilence()); } else { setPlaybackParams(UserPreferences.getPlaybackSpeed(), UserPreferences.isSkipSilence()); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index ddc8e770a..6126508c6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -291,6 +291,8 @@ class DBUpgrader { if (oldVersion < 1070306) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " TEXT"); + db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA + + " ADD COLUMN " + PodDBAdapter.KEY_LAST_PLAYBACK_SPEED + " TEXT"); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index 4f0ee70ef..afd99bc1b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -760,6 +760,20 @@ public class DBWriter { }); } + /** + * Saves the 'lastPlaybackSpeed' attribute of a FeedMedia object + * + * @param media The FeedMedia object. + */ + public static Future setFeedMediaLastPlaybackSpeed(final FeedMedia media) { + return dbExec.submit(() -> { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setFeedMediaLastPlaybackSpeed(media); + adapter.close(); + }); + } + /** * Saves a FeedItem object in the database. This method will save all attributes of the FeedItem object including * the content of FeedComponent-attributes. diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 63c036b6e..0f4bca09a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -115,6 +115,7 @@ public class PodDBAdapter { public static final String KEY_INCLUDE_FILTER = "include_filter"; public static final String KEY_EXCLUDE_FILTER = "exclude_filter"; public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed"; + public static final String KEY_LAST_PLAYBACK_SPEED = "last_playback_speed"; // Table names static final String TABLE_NAME_FEEDS = "Feeds"; @@ -169,7 +170,8 @@ public class PodDBAdapter { + KEY_FEEDITEM + " INTEGER," + KEY_PLAYED_DURATION + " INTEGER," + KEY_HAS_EMBEDDED_PICTURE + " INTEGER," - + KEY_LAST_PLAYED_TIME + " INTEGER)"; + + KEY_LAST_PLAYED_TIME + " INTEGER," + + KEY_LAST_PLAYBACK_SPEED + " TEXT)"; private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE " + TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE @@ -440,6 +442,7 @@ public class PodDBAdapter { values.put(KEY_FILE_URL, media.getFile_url()); values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); + values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); if (media.getPlaybackCompletionDate() != null) { values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); @@ -465,6 +468,7 @@ public class PodDBAdapter { values.put(KEY_DURATION, media.getDuration()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); + values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { @@ -472,11 +476,24 @@ public class PodDBAdapter { } } + public void setFeedMediaLastPlaybackSpeed(FeedMedia media) { + if (media.getId() != 0) { + ContentValues values = new ContentValues(); + values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); + db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", + new String[]{String.valueOf(media.getId())}); + } else { + Log.e(TAG, "setFeedMediaLastPlaybackSpeed: ID of media was 0"); + } + } + public void setFeedMediaPlaybackCompletionDate(FeedMedia media) { if (media.getId() != 0) { ContentValues values = new ContentValues(); values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); + // Also reset stored playback speed for media + values.putNull(KEY_LAST_PLAYBACK_SPEED); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { From 7cc602a078345419cfe7bef2190295ed663a8a9e Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Thu, 12 Sep 2019 11:06:05 +0200 Subject: [PATCH 03/22] Set a descriptive summary on the per-feed playback speed setting --- .../antennapod/fragment/FeedSettingsFragment.java | 10 ++-------- app/src/main/res/xml/feed_settings.xml | 1 + core/src/main/res/values/strings.xml | 1 + 3 files changed, 4 insertions(+), 8 deletions(-) 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 56d58d1db..130ce2232 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -128,14 +128,8 @@ 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); + String speedValue = feedPreferences.getFeedPlaybackSpeed(); + feedPlaybackSpeedPreference.setValue(speedValue); } private void updateAutoDeleteSummary() { diff --git a/app/src/main/res/xml/feed_settings.xml b/app/src/main/res/xml/feed_settings.xml index 16e008e0d..4a9e039b0 100644 --- a/app/src/main/res/xml/feed_settings.xml +++ b/app/src/main/res/xml/feed_settings.xml @@ -9,6 +9,7 @@ This setting does not apply to authentication errors. Playback Speeds Customize the speeds available for variable speed audio playback + The speed to use when starting audio playback for episodes in this feed Adjust media info to playback speed Displayed position and duration are adapted to playback speed Fast Forward Skip Time From e7df195d3a0f7127b968d39af90a1cfe74d1c33a Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Thu, 12 Sep 2019 23:49:17 +0200 Subject: [PATCH 04/22] Formatted settings xml and moved setting one step down --- app/src/main/res/xml/feed_settings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/xml/feed_settings.xml b/app/src/main/res/xml/feed_settings.xml index 4a9e039b0..505248198 100644 --- a/app/src/main/res/xml/feed_settings.xml +++ b/app/src/main/res/xml/feed_settings.xml @@ -7,16 +7,16 @@ android:title="@string/keep_updated" android:summary="@string/keep_updated_summary"/> - - + + Date: Thu, 12 Sep 2019 23:49:32 +0200 Subject: [PATCH 05/22] Replaced for loop array copy with System.arraycopy calls --- .../de/danoeh/antennapod/fragment/FeedSettingsFragment.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 130ce2232..143f719f5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -60,10 +60,8 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { 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]; - } + System.arraycopy(speeds, 0, values, 1, speeds.length); + System.arraycopy(speeds, 0, entries, 1, speeds.length); feedPlaybackSpeedPreference.setEntryValues(values); feedPlaybackSpeedPreference.setEntries(entries); From 4746b16b12b1a8b70e0fcad6c381e5f4d66f491a Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 00:16:22 +0200 Subject: [PATCH 06/22] Changed type of media last playback speed to float from string Also sets default to "magic" -1 value --- .../activity/AudioplayerActivity.java | 6 +++- .../activity/MediaplayerActivity.java | 13 +++++-- .../dialog/PlaybackControlsDialog.java | 11 ++++-- .../antennapod/fragment/QueueFragment.java | 4 +++ .../danoeh/antennapod/core/feed/FeedItem.java | 4 ++- .../antennapod/core/feed/FeedMedia.java | 35 +++++++++---------- .../antennapod/core/feed/FeedPreferences.java | 6 ++-- .../core/service/playback/LocalPSMP.java | 13 +++++-- .../antennapod/core/storage/DBUpgrader.java | 4 ++- .../antennapod/core/storage/PodDBAdapter.java | 17 +++++---- 10 files changed, 73 insertions(+), 40 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 5e81295b1..d2e929d20 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -152,7 +152,11 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { private void storeNewMediaPlaybackSpeed(String speed) { Playable media = controller.getMedia(); if (media instanceof FeedMedia) { - ((FeedMedia) media).updateLastPlaybackSpeed(speed); + try { + ((FeedMedia) media).updateLastPlaybackSpeed(Float.parseFloat(speed)); + } catch (NumberFormatException e) { + // Well this was awkward... + } } } } 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 b6697ef52..d5801265f 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -64,6 +64,8 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + /** * Provides general features which are both needed for playing audio and video @@ -873,16 +875,21 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements } } - protected float getPlaybackSpeedForMedia() { + float getPlaybackSpeedForMedia() { + float playbackSpeed = SPEED_USE_GLOBAL; if (controller != null) { Playable media = controller.getMedia(); boolean isFeedMedia = media instanceof FeedMedia; if (isFeedMedia) { - return ((FeedMedia) media).getMediaPlaybackSpeed(); + playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); } } - return UserPreferences.getPlaybackSpeed(); + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } + + return playbackSpeed; } } 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 86720f40a..5afebb22e 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -20,6 +20,8 @@ import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + public class PlaybackControlsDialog extends DialogFragment { private static final float PLAYBACK_SPEED_STEP = 0.05f; private static final float DEFAULT_MIN_PLAYBACK_SPEED = 0.5f; @@ -214,15 +216,20 @@ public class PlaybackControlsDialog extends DialogFragment { return UserPreferences.getVideoPlaybackSpeed(); } + float playbackSpeed = SPEED_USE_GLOBAL; if (controller != null) { Playable media = controller.getMedia(); boolean isFeedMedia = media instanceof FeedMedia; if (isFeedMedia) { - return ((FeedMedia) media).getMediaPlaybackSpeed(); + playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); } } - return UserPreferences.getPlaybackSpeed(); + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } + + return playbackSpeed; } } 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 902708e9a..238d9c7ca 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -63,6 +63,7 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_DELETE; import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_REMOVE_FROM_QUEUE; @@ -600,6 +601,9 @@ public class QueueFragment extends Fragment { long timeLeft = 0; for(FeedItem item : queue) { float playbackSpeed = item.getFeedPlaybackSpeed(); + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } if(item.getMedia() != null) { timeLeft += (long) ((item.getMedia().getDuration() - item.getMedia().getPosition()) diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 3b70e4a4d..70e5ea9f4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -20,6 +20,8 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.ShownotesProvider; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + /** * Data Object for a XML message * @@ -493,6 +495,6 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, ImageR if (feed != null) { return feed.getPreferences().getCurrentPlaybackSpeed(); } - return UserPreferences.getPlaybackSpeed(); + return SPEED_USE_GLOBAL; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 46795bc11..9aa4dd2d0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -21,15 +21,18 @@ import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.ChapterUtils; import de.danoeh.antennapod.core.util.playback.Playable; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + public class FeedMedia extends FeedFile implements Playable { private static final String TAG = "FeedMedia"; + public static final float LAST_PLAYBACK_SPEED_UNSET = SPEED_USE_GLOBAL; + public static final int FEEDFILETYPE_FEEDMEDIA = 2; public static final int PLAYABLE_TYPE_FEEDMEDIA = 1; @@ -55,7 +58,7 @@ public class FeedMedia extends FeedFile implements Playable { private Date playbackCompletionDate; private int startPosition = -1; private int playedDurationWhenStarted; - private String lastPlaybackSpeed = null; + private float lastPlaybackSpeed = LAST_PLAYBACK_SPEED_UNSET; // if null: unknown, will be checked private Boolean hasEmbeddedPicture; @@ -92,7 +95,7 @@ public class FeedMedia extends FeedFile implements Playable { private FeedMedia(long id, FeedItem item, int duration, int position, long size, String mime_type, String file_url, String download_url, boolean downloaded, Date playbackCompletionDate, int played_duration, - Boolean hasEmbeddedPicture, long lastPlayedTime, String lastPlaybackSpeed) { + Boolean hasEmbeddedPicture, long lastPlayedTime, float lastPlaybackSpeed) { this(id, item, duration, position, size, mime_type, file_url, download_url, downloaded, playbackCompletionDate, played_duration, lastPlayedTime); this.hasEmbeddedPicture = hasEmbeddedPicture; @@ -111,7 +114,7 @@ public class FeedMedia extends FeedFile implements Playable { int indexDownloaded = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED); int indexPlayedDuration = cursor.getColumnIndex(PodDBAdapter.KEY_PLAYED_DURATION); int indexLastPlayedTime = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_PLAYED_TIME); - int indexLastPlaybackSpeed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_PLAYBACK_SPEED); + int indexLastPlaybackSpeed = cursor.getColumnIndex(PodDBAdapter.KEY_MEDIA_LAST_PLAYBACK_SPEED); long mediaId = cursor.getLong(indexId); Date playbackCompletionDate = null; @@ -147,7 +150,7 @@ public class FeedMedia extends FeedFile implements Playable { cursor.getInt(indexPlayedDuration), hasEmbeddedPicture, cursor.getLong(indexLastPlayedTime), - cursor.getString(indexLastPlaybackSpeed) + cursor.getFloat(indexLastPlaybackSpeed) ); } @@ -628,11 +631,11 @@ public class FeedMedia extends FeedFile implements Playable { return super.equals(o); } - public String getLastPlaybackSpeed() { + public float getLastPlaybackSpeed() { return lastPlaybackSpeed; } - public void updateLastPlaybackSpeed(String newSpeed) { + public void updateLastPlaybackSpeed(float newSpeed) { lastPlaybackSpeed = newSpeed; DBWriter.setFeedMediaPlaybackInformation(this); } @@ -642,19 +645,15 @@ public class FeedMedia extends FeedFile implements Playable { * @return the current playback speed for the media, or the feed's configured speed */ public float getMediaPlaybackSpeed() { - if (lastPlaybackSpeed != null) { - try { - return Float.parseFloat(lastPlaybackSpeed); - } catch (NumberFormatException e) { - lastPlaybackSpeed = null; + float playbackSpeed = lastPlaybackSpeed; + + if (playbackSpeed == LAST_PLAYBACK_SPEED_UNSET) { + FeedItem item = getItem(); + if (item != null) { + playbackSpeed = item.getFeedPlaybackSpeed(); } } - FeedItem item = getItem(); - if (item != null) { - return item.getFeedPlaybackSpeed(); - } - - return UserPreferences.getPlaybackSpeed(); + return playbackSpeed; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java index d7d173e19..2c840952c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java @@ -14,6 +14,8 @@ import de.danoeh.antennapod.core.storage.PodDBAdapter; */ public class FeedPreferences { + public static final float SPEED_USE_GLOBAL = -1; + @NonNull private FeedFilter filter; private long feedID; @@ -180,7 +182,7 @@ public class FeedPreferences { this.password = password; } - public float getCurrentPlaybackSpeed() { + float getCurrentPlaybackSpeed() { float speed = 0.0f; if (!"global".equals(feedPlaybackSpeed)) { @@ -193,7 +195,7 @@ public class FeedPreferences { // Either global or error happened if (speed == 0.0f) { - speed = UserPreferences.getPlaybackSpeed(); + speed = SPEED_USE_GLOBAL; } return speed; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index abb5d83bd..6a694eb6f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -35,6 +35,8 @@ import de.danoeh.antennapod.core.util.playback.IPlayer; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.VideoPlayer; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + /** * Manages the MediaPlayer object of the PlaybackService. */ @@ -305,13 +307,18 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Audiofocus successfully requested"); Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); + float playbackSpeed; if (media.getMediaType() == MediaType.VIDEO) { - setPlaybackParams(UserPreferences.getVideoPlaybackSpeed(), UserPreferences.isSkipSilence()); + playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); } else if (media instanceof FeedMedia) { - setPlaybackParams(((FeedMedia) media).getMediaPlaybackSpeed(), UserPreferences.isSkipSilence()); + playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); } else { - setPlaybackParams(UserPreferences.getPlaybackSpeed(), UserPreferences.isSkipSilence()); + playbackSpeed = SPEED_USE_GLOBAL; } + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } + setPlaybackParams(playbackSpeed, UserPreferences.isSkipSilence()); setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index 6126508c6..d06f13177 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -8,6 +8,8 @@ import android.util.Log; import de.danoeh.antennapod.core.feed.FeedItem; +import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; + class DBUpgrader { /** * Upgrades the given database to a new schema version @@ -292,7 +294,7 @@ class DBUpgrader { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " TEXT"); db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA - + " ADD COLUMN " + PodDBAdapter.KEY_LAST_PLAYBACK_SPEED + " TEXT"); + + " ADD COLUMN " + PodDBAdapter.KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL DEFAULT " + LAST_PLAYBACK_SPEED_UNSET); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 0f4bca09a..44a653158 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -12,10 +12,7 @@ import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; -import android.media.MediaMetadataRetriever; import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; @@ -40,6 +37,8 @@ import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.util.LongIntMap; import org.greenrobot.eventbus.EventBus; +import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; + // TODO Remove media column from feeditem table /** @@ -115,7 +114,7 @@ public class PodDBAdapter { public static final String KEY_INCLUDE_FILTER = "include_filter"; public static final String KEY_EXCLUDE_FILTER = "exclude_filter"; public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed"; - public static final String KEY_LAST_PLAYBACK_SPEED = "last_playback_speed"; + public static final String KEY_MEDIA_LAST_PLAYBACK_SPEED = "last_playback_speed"; // Table names static final String TABLE_NAME_FEEDS = "Feeds"; @@ -171,7 +170,7 @@ public class PodDBAdapter { + KEY_PLAYED_DURATION + " INTEGER," + KEY_HAS_EMBEDDED_PICTURE + " INTEGER," + KEY_LAST_PLAYED_TIME + " INTEGER," - + KEY_LAST_PLAYBACK_SPEED + " TEXT)"; + + KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL)"; private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE " + TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE @@ -442,7 +441,7 @@ public class PodDBAdapter { values.put(KEY_FILE_URL, media.getFile_url()); values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); - values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); + values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); if (media.getPlaybackCompletionDate() != null) { values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); @@ -468,7 +467,7 @@ public class PodDBAdapter { values.put(KEY_DURATION, media.getDuration()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); - values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); + values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { @@ -479,7 +478,7 @@ public class PodDBAdapter { public void setFeedMediaLastPlaybackSpeed(FeedMedia media) { if (media.getId() != 0) { ContentValues values = new ContentValues(); - values.put(KEY_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); + values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { @@ -493,7 +492,7 @@ public class PodDBAdapter { values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); // Also reset stored playback speed for media - values.putNull(KEY_LAST_PLAYBACK_SPEED); + values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, LAST_PLAYBACK_SPEED_UNSET); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { From 2edc40cd6ea8166bbe64c8c724d93d257e67e55d Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 00:17:21 +0200 Subject: [PATCH 07/22] Changed database version in upgrade to be at least 1.7.4 --- .../main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index d06f13177..8f2c391a9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -290,7 +290,7 @@ class DBUpgrader { db.execSQL("DROP TABLE " + PodDBAdapter.TABLE_NAME_FEED_IMAGES); } - if (oldVersion < 1070306) { + if (oldVersion < 1070400) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " TEXT"); db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA From b1190881bac940e617af349e38e389eab07043df Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 00:19:27 +0200 Subject: [PATCH 08/22] Set a default value for last playback speed in database --- .../java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 44a653158..31e8ea351 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -170,7 +170,7 @@ public class PodDBAdapter { + KEY_PLAYED_DURATION + " INTEGER," + KEY_HAS_EMBEDDED_PICTURE + " INTEGER," + KEY_LAST_PLAYED_TIME + " INTEGER," - + KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL)"; + + KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL DEFAULT " + LAST_PLAYBACK_SPEED_UNSET + ")"; private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE " + TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE From a91d44e787d049d2e8eb986e8263a5837ab62834 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 00:27:49 +0200 Subject: [PATCH 09/22] Respect media speed for videos --- .../antennapod/dialog/PlaybackControlsDialog.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 5afebb22e..a8b58a757 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -212,10 +212,6 @@ public class PlaybackControlsDialog extends DialogFragment { } private float getCurrentSpeed() { - if (isPlayingVideo) { - return UserPreferences.getVideoPlaybackSpeed(); - } - float playbackSpeed = SPEED_USE_GLOBAL; if (controller != null) { Playable media = controller.getMedia(); @@ -227,7 +223,11 @@ public class PlaybackControlsDialog extends DialogFragment { } if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = UserPreferences.getPlaybackSpeed(); + if (isPlayingVideo) { + playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); + } else { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } } return playbackSpeed; From e5176c6a198db3401cb4779e0fe537211fb8926b Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 21:27:02 +0200 Subject: [PATCH 10/22] Updated database version to 1.7.4 --- .../java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 31e8ea351..d4e74c038 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -1472,7 +1472,7 @@ public class PodDBAdapter { */ private static class PodDBHelper extends SQLiteOpenHelper { - private static final int VERSION = 1070306; + private static final int VERSION = 1070400; private final Context context; From 3bcb368bb31198372a4ad45a5c3d3cc72a4201e4 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 23:22:13 +0200 Subject: [PATCH 11/22] Check the media's own speed before loading video speed --- .../core/service/playback/LocalPSMP.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 6a694eb6f..fe3b5223e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -307,17 +307,19 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Audiofocus successfully requested"); Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); - float playbackSpeed; - if (media.getMediaType() == MediaType.VIDEO) { - playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); - } else if (media instanceof FeedMedia) { + + float playbackSpeed = SPEED_USE_GLOBAL; + if (media instanceof FeedMedia) { playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); - } else { - playbackSpeed = SPEED_USE_GLOBAL; } if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = UserPreferences.getPlaybackSpeed(); + if (media.getMediaType() == MediaType.VIDEO) { + playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); + } else { + playbackSpeed = UserPreferences.getPlaybackSpeed(); + } } + setPlaybackParams(playbackSpeed, UserPreferences.isSkipSilence()); setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); From d0f19a2b148c0ed04dd51f88854d9696bfe3a190 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 23:27:55 +0200 Subject: [PATCH 12/22] Inlined getFeedPlaybackSpeed method on FeedItem --- .../de/danoeh/antennapod/fragment/QueueFragment.java | 6 +++++- .../java/de/danoeh/antennapod/core/feed/FeedItem.java | 11 ----------- .../de/danoeh/antennapod/core/feed/FeedMedia.java | 5 ++++- .../danoeh/antennapod/core/feed/FeedPreferences.java | 2 +- 4 files changed, 10 insertions(+), 14 deletions(-) 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 238d9c7ca..0f51d4622 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -600,7 +600,11 @@ public class QueueFragment extends Fragment { if(queue.size() > 0) { long timeLeft = 0; for(FeedItem item : queue) { - float playbackSpeed = item.getFeedPlaybackSpeed(); + float playbackSpeed = SPEED_USE_GLOBAL; + Feed feed = item.getFeed(); + if (feed != null) { + playbackSpeed = feed.getPreferences().getCurrentPlaybackSpeed(); + } if (playbackSpeed == SPEED_USE_GLOBAL) { playbackSpeed = UserPreferences.getPlaybackSpeed(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 70e5ea9f4..86d8f5294 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -486,15 +486,4 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, ImageR return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } - /** - * - * @return playback speed for this feed, or the global setting if no feed-specific setting - */ - public float getFeedPlaybackSpeed() { - Feed feed = getFeed(); - if (feed != null) { - return feed.getPreferences().getCurrentPlaybackSpeed(); - } - return SPEED_USE_GLOBAL; - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 9aa4dd2d0..61cafef94 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -650,7 +650,10 @@ public class FeedMedia extends FeedFile implements Playable { if (playbackSpeed == LAST_PLAYBACK_SPEED_UNSET) { FeedItem item = getItem(); if (item != null) { - playbackSpeed = item.getFeedPlaybackSpeed(); + Feed feed = item.getFeed(); + if (feed != null) { + playbackSpeed = feed.getPreferences().getCurrentPlaybackSpeed(); + } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java index 2c840952c..b607d8b42 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java @@ -182,7 +182,7 @@ public class FeedPreferences { this.password = password; } - float getCurrentPlaybackSpeed() { + public float getCurrentPlaybackSpeed() { float speed = 0.0f; if (!"global".equals(feedPlaybackSpeed)) { From 19896f0ec2dc1a1380fa05ccf59ca950bc76e6b5 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 23:30:20 +0200 Subject: [PATCH 13/22] Removed unused methods --- .../danoeh/antennapod/core/storage/DBWriter.java | 14 -------------- .../antennapod/core/storage/PodDBAdapter.java | 11 ----------- 2 files changed, 25 deletions(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index afd99bc1b..4f0ee70ef 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -760,20 +760,6 @@ public class DBWriter { }); } - /** - * Saves the 'lastPlaybackSpeed' attribute of a FeedMedia object - * - * @param media The FeedMedia object. - */ - public static Future setFeedMediaLastPlaybackSpeed(final FeedMedia media) { - return dbExec.submit(() -> { - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setFeedMediaLastPlaybackSpeed(media); - adapter.close(); - }); - } - /** * Saves a FeedItem object in the database. This method will save all attributes of the FeedItem object including * the content of FeedComponent-attributes. diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index d4e74c038..1104ca684 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -475,17 +475,6 @@ public class PodDBAdapter { } } - public void setFeedMediaLastPlaybackSpeed(FeedMedia media) { - if (media.getId() != 0) { - ContentValues values = new ContentValues(); - values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); - db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", - new String[]{String.valueOf(media.getId())}); - } else { - Log.e(TAG, "setFeedMediaLastPlaybackSpeed: ID of media was 0"); - } - } - public void setFeedMediaPlaybackCompletionDate(FeedMedia media) { if (media.getId() != 0) { ContentValues values = new ContentValues(); From 684213c291a3b1f2cdb3259789a5c0928fd40c78 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Fri, 13 Sep 2019 23:53:42 +0200 Subject: [PATCH 14/22] Moved logic for selecting playback speed entirely to UserPreferences --- .../activity/AudioplayerActivity.java | 4 +-- .../activity/MediaplayerActivity.java | 18 ------------ .../dialog/PlaybackControlsDialog.java | 19 ++----------- .../antennapod/fragment/QueueFragment.java | 2 +- .../core/preferences/UserPreferences.java | 28 +++++++++++++++++-- .../core/service/playback/LocalPSMP.java | 14 +--------- 6 files changed, 33 insertions(+), 52 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 d2e929d20..2f2981dac 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -80,7 +80,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { } float speed = 1.0f; if(controller.canSetPlaybackSpeed()) { - speed = getPlaybackSpeedForMedia(); + speed = UserPreferences.getPlaybackSpeed(controller.getMedia()); } String speedStr = new DecimalFormat("0.00x").format(speed); butPlaybackSpeed.setText(speedStr); @@ -107,7 +107,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { float currentSpeedValue = controller.getCurrentPlaybackSpeedMultiplier(); if (currentSpeedValue == -1) { - currentSpeedValue = getPlaybackSpeedForMedia(); + currentSpeedValue = UserPreferences.getPlaybackSpeed(controller.getMedia()); } String currentSpeed = new DecimalFormat("0.00", format).format(currentSpeedValue); 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 d5801265f..a907c738a 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -874,22 +874,4 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements } } } - - float getPlaybackSpeedForMedia() { - float playbackSpeed = SPEED_USE_GLOBAL; - if (controller != null) { - Playable media = controller.getMedia(); - boolean isFeedMedia = media instanceof FeedMedia; - - if (isFeedMedia) { - playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); - } - } - - if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = UserPreferences.getPlaybackSpeed(); - } - - return playbackSpeed; - } } 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 a8b58a757..3dc8abbbe 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -212,24 +212,11 @@ public class PlaybackControlsDialog extends DialogFragment { } private float getCurrentSpeed() { - float playbackSpeed = SPEED_USE_GLOBAL; + Playable media = null; if (controller != null) { - Playable media = controller.getMedia(); - boolean isFeedMedia = media instanceof FeedMedia; - - if (isFeedMedia) { - playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); - } + media = controller.getMedia(); } - if (playbackSpeed == SPEED_USE_GLOBAL) { - if (isPlayingVideo) { - playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); - } else { - playbackSpeed = UserPreferences.getPlaybackSpeed(); - } - } - - return playbackSpeed; + return UserPreferences.getPlaybackSpeed(media); } } 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 0f51d4622..19e84fb19 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -606,7 +606,7 @@ public class QueueFragment extends Fragment { playbackSpeed = feed.getPreferences().getCurrentPlaybackSpeed(); } if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = UserPreferences.getPlaybackSpeed(); + playbackSpeed = UserPreferences.getPlaybackSpeed(item.getMedia()); } if(item.getMedia() != null) { timeLeft += diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index b8ab1c888..80f0fd454 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -22,6 +22,8 @@ import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.service.download.ProxyConfig; import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; @@ -29,9 +31,12 @@ import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; import de.danoeh.antennapod.core.util.Converter; +import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.SortOrder; import de.danoeh.antennapod.core.util.download.AutoUpdateManager; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + /** * Provides access to preferences set by the user in the settings screen. A * private instance of this class must first be instantiated via @@ -320,7 +325,26 @@ public class UserPreferences { return prefs.getBoolean(PREF_DELETE_REMOVES_FROM_QUEUE, false); } - public static float getPlaybackSpeed() { + public static float getPlaybackSpeed(Playable media) { + float playbackSpeed = SPEED_USE_GLOBAL; + if (media != null) { + if (media instanceof FeedMedia) { + playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); + } + + if (playbackSpeed == SPEED_USE_GLOBAL && media.getMediaType() == MediaType.VIDEO) { + playbackSpeed = getVideoPlaybackSpeed(); + } + } + + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = getAudioPlaybackSpeed(); + } + + return playbackSpeed; + } + + private static float getAudioPlaybackSpeed() { try { return Float.parseFloat(prefs.getString(PREF_PLAYBACK_SPEED, "1.00")); } catch (NumberFormatException e) { @@ -330,7 +354,7 @@ public class UserPreferences { } } - public static float getVideoPlaybackSpeed() { + private static float getVideoPlaybackSpeed() { try { return Float.parseFloat(prefs.getString(PREF_VIDEO_PLAYBACK_SPEED, "1.00")); } catch (NumberFormatException e) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index fe3b5223e..0788a05e8 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -308,19 +308,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); - float playbackSpeed = SPEED_USE_GLOBAL; - if (media instanceof FeedMedia) { - playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); - } - if (playbackSpeed == SPEED_USE_GLOBAL) { - if (media.getMediaType() == MediaType.VIDEO) { - playbackSpeed = UserPreferences.getVideoPlaybackSpeed(); - } else { - playbackSpeed = UserPreferences.getPlaybackSpeed(); - } - } - - setPlaybackParams(playbackSpeed, UserPreferences.isSkipSilence()); + setPlaybackParams(UserPreferences.getPlaybackSpeed(media), UserPreferences.isSkipSilence()); setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { From 60eb41048f0d3654b629be7476b476641b4f2223 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sat, 14 Sep 2019 00:09:24 +0200 Subject: [PATCH 15/22] Converted playback speed in media preferences to a float instead of String --- .../fragment/FeedSettingsFragment.java | 9 +++--- .../antennapod/fragment/QueueFragment.java | 2 +- .../antennapod/core/feed/FeedMedia.java | 2 +- .../antennapod/core/feed/FeedPreferences.java | 31 ++++--------------- .../antennapod/core/storage/DBUpgrader.java | 3 +- .../antennapod/core/storage/PodDBAdapter.java | 3 +- 6 files changed, 17 insertions(+), 33 deletions(-) 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 143f719f5..0e6afe355 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -19,6 +19,7 @@ import de.danoeh.antennapod.dialog.EpisodeFilterDialog; import de.danoeh.antennapod.viewmodel.FeedSettingsViewModel; import static de.danoeh.antennapod.activity.FeedSettingsActivity.EXTRA_FEED_ID; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; public class FeedSettingsFragment extends PreferenceFragmentCompat { private static final CharSequence PREF_EPISODE_FILTER = "episodeFilter"; @@ -55,7 +56,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { String[] speeds = UserPreferences.getPlaybackSpeedArray(); String[] values = new String[speeds.length + 1]; - values[0] = "global"; + values[0] = Float.toString(SPEED_USE_GLOBAL); String[] entries = new String[speeds.length + 1]; entries[0] = getString(R.string.feed_auto_download_global); @@ -67,7 +68,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { feedPlaybackSpeedPreference.setEntries(entries); feedPlaybackSpeedPreference.setOnPreferenceChangeListener((preference, newValue) -> { - feedPreferences.setFeedPlaybackSpeed((String) newValue); + feedPreferences.setFeedPlaybackSpeed(Float.parseFloat((String) newValue)); feed.savePreferences(); updatePlaybackSpeedPreference(); return false; @@ -126,8 +127,8 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { private void updatePlaybackSpeedPreference() { ListPreference feedPlaybackSpeedPreference = (ListPreference) findPreference(PREF_FEED_PLAYBACK_SPEED); - String speedValue = feedPreferences.getFeedPlaybackSpeed(); - feedPlaybackSpeedPreference.setValue(speedValue); + float speedValue = feedPreferences.getFeedPlaybackSpeed(); + feedPlaybackSpeedPreference.setValue(Float.toString(speedValue)); } private void updateAutoDeleteSummary() { 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 19e84fb19..423e8b17b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -603,7 +603,7 @@ public class QueueFragment extends Fragment { float playbackSpeed = SPEED_USE_GLOBAL; Feed feed = item.getFeed(); if (feed != null) { - playbackSpeed = feed.getPreferences().getCurrentPlaybackSpeed(); + playbackSpeed = feed.getPreferences().getFeedPlaybackSpeed(); } if (playbackSpeed == SPEED_USE_GLOBAL) { playbackSpeed = UserPreferences.getPlaybackSpeed(item.getMedia()); diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 61cafef94..05ca84bac 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -652,7 +652,7 @@ public class FeedMedia extends FeedFile implements Playable { if (item != null) { Feed feed = item.getFeed(); if (feed != null) { - playbackSpeed = feed.getPreferences().getCurrentPlaybackSpeed(); + playbackSpeed = feed.getPreferences().getFeedPlaybackSpeed(); } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java index b607d8b42..b0512d844 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java @@ -30,13 +30,13 @@ public class FeedPreferences { private AutoDeleteAction auto_delete_action; private String username; private String password; - private String feedPlaybackSpeed; + private float feedPlaybackSpeed; public FeedPreferences(long feedID, boolean autoDownload, AutoDeleteAction auto_delete_action, String username, String password) { - this(feedID, autoDownload, true, auto_delete_action, username, password, new FeedFilter(), "global"); + this(feedID, autoDownload, true, auto_delete_action, username, password, new FeedFilter(), SPEED_USE_GLOBAL); } - private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, String username, String password, @NonNull FeedFilter filter, String feedPlaybackSpeed) { + private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, String username, String password, @NonNull FeedFilter filter, float feedPlaybackSpeed) { this.feedID = feedID; this.autoDownload = autoDownload; this.keepUpdated = keepUpdated; @@ -67,7 +67,7 @@ public class FeedPreferences { String password = cursor.getString(indexPassword); String includeFilter = cursor.getString(indexIncludeFilter); String excludeFilter = cursor.getString(indexExcludeFilter); - String feedPlaybackSpeed = cursor.getString(indexFeedPlaybackSpeed); + float feedPlaybackSpeed = cursor.getFloat(indexFeedPlaybackSpeed); return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, username, password, new FeedFilter(includeFilter, excludeFilter), feedPlaybackSpeed); } @@ -182,30 +182,11 @@ public class FeedPreferences { this.password = password; } - public float getCurrentPlaybackSpeed() { - float speed = 0.0f; - - if (!"global".equals(feedPlaybackSpeed)) { - try { - speed = Float.parseFloat(getFeedPlaybackSpeed()); - } catch (NumberFormatException e) { - setFeedPlaybackSpeed("global"); - } - } - - // Either global or error happened - if (speed == 0.0f) { - speed = SPEED_USE_GLOBAL; - } - - return speed; - } - - public String getFeedPlaybackSpeed() { + public float getFeedPlaybackSpeed() { return feedPlaybackSpeed; } - public void setFeedPlaybackSpeed(String playbackSpeed) { + public void setFeedPlaybackSpeed(float playbackSpeed) { feedPlaybackSpeed = playbackSpeed; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index 8f2c391a9..41b39deac 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -9,6 +9,7 @@ import android.util.Log; import de.danoeh.antennapod.core.feed.FeedItem; import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; class DBUpgrader { /** @@ -292,7 +293,7 @@ class DBUpgrader { } if (oldVersion < 1070400) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS - + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " TEXT"); + + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL); db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA + " ADD COLUMN " + PodDBAdapter.KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL DEFAULT " + LAST_PLAYBACK_SPEED_UNSET); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 1104ca684..0c93590e2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -38,6 +38,7 @@ import de.danoeh.antennapod.core.util.LongIntMap; import org.greenrobot.eventbus.EventBus; import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; // TODO Remove media column from feeditem table @@ -148,7 +149,7 @@ public class PodDBAdapter { + KEY_HIDE + " TEXT," + KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0," + KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0," - + KEY_FEED_PLAYBACK_SPEED + " TEXT)"; + + KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + ")"; private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE " + TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE From d746121a9bdd5c3a432a30b99638c442a6e6df5c Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sat, 14 Sep 2019 00:13:19 +0200 Subject: [PATCH 16/22] Included Media playback speed into controller getter --- .../de/danoeh/antennapod/activity/AudioplayerActivity.java | 4 ---- .../antennapod/core/util/playback/PlaybackController.java | 2 +- 2 files changed, 1 insertion(+), 5 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 2f2981dac..8e063374a 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -106,10 +106,6 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { format.setDecimalSeparator('.'); float currentSpeedValue = controller.getCurrentPlaybackSpeedMultiplier(); - if (currentSpeedValue == -1) { - currentSpeedValue = UserPreferences.getPlaybackSpeed(controller.getMedia()); - } - String currentSpeed = new DecimalFormat("0.00", format).format(currentSpeedValue); // Provide initial value in case the speed list has changed diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 0cfaaab3c..9caa2156d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java @@ -746,7 +746,7 @@ public class PlaybackController { if (playbackService != null && canSetPlaybackSpeed()) { return playbackService.getCurrentPlaybackSpeed(); } else { - return -1; + return UserPreferences.getPlaybackSpeed(getMedia()); } } From 044fd7e7f958ca16508598cda7f9a140a80bd79a Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sun, 15 Sep 2019 21:57:37 +0200 Subject: [PATCH 17/22] Ensured playback preference is converted to consistent decimal format Since you can't be sure floats compare equal to one another, the preference list would not highlight certain playback values when they were selected. --- .../antennapod/fragment/FeedSettingsFragment.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) 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 0e6afe355..8eb5ecd6b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -18,12 +18,17 @@ import de.danoeh.antennapod.dialog.AuthenticationDialog; import de.danoeh.antennapod.dialog.EpisodeFilterDialog; import de.danoeh.antennapod.viewmodel.FeedSettingsViewModel; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + import static de.danoeh.antennapod.activity.FeedSettingsActivity.EXTRA_FEED_ID; import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; public class FeedSettingsFragment extends PreferenceFragmentCompat { private static final CharSequence PREF_EPISODE_FILTER = "episodeFilter"; private static final String PREF_FEED_PLAYBACK_SPEED = "feedPlaybackSpeed"; + private static final DecimalFormat decimalFormat = new DecimalFormat("0.00", DecimalFormatSymbols.getInstance(Locale.US)); private Feed feed; private FeedPreferences feedPreferences; @@ -56,7 +61,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { String[] speeds = UserPreferences.getPlaybackSpeedArray(); String[] values = new String[speeds.length + 1]; - values[0] = Float.toString(SPEED_USE_GLOBAL); + values[0] = decimalFormat.format(SPEED_USE_GLOBAL); String[] entries = new String[speeds.length + 1]; entries[0] = getString(R.string.feed_auto_download_global); @@ -128,7 +133,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { ListPreference feedPlaybackSpeedPreference = (ListPreference) findPreference(PREF_FEED_PLAYBACK_SPEED); float speedValue = feedPreferences.getFeedPlaybackSpeed(); - feedPlaybackSpeedPreference.setValue(Float.toString(speedValue)); + feedPlaybackSpeedPreference.setValue(decimalFormat.format(speedValue)); } private void updateAutoDeleteSummary() { @@ -206,7 +211,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat { } @Override - public void onConfirmButtonPressed(DialogInterface dialog) { + public void onConfirmButtonPressed(DialogInterface dialog) { DBWriter.setFeedsItemsAutoDownload(feed, autoDownload); } } From de78c0e31eeff0609fe5388204e6e39e8f60579b Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Mon, 16 Sep 2019 14:38:07 +0200 Subject: [PATCH 18/22] Fixed playback speed not changing when episode ended and next started playing --- .../de/danoeh/antennapod/core/service/playback/LocalPSMP.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 0788a05e8..72f5f183a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -245,6 +245,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { try { media.loadMetadata(); callback.onMediaChanged(false); + setPlaybackParams(UserPreferences.getPlaybackSpeed(media), UserPreferences.isSkipSilence()); if (stream) { mediaPlayer.setDataSource(media.getStreamUrl()); } else if (media.getLocalMediaUrl() != null && new File(media.getLocalMediaUrl()).canRead()) { From 6a37d33b97ae90ebe6329fa6998f057f4f4f4120 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sat, 5 Oct 2019 02:15:26 +0200 Subject: [PATCH 19/22] Changed from db backed item speed to preferences backed global value --- .../activity/AudioplayerActivity.java | 22 ++++------ .../dialog/PlaybackControlsDialog.java | 6 +-- .../antennapod/fragment/QueueFragment.java | 12 +----- .../antennapod/core/feed/FeedMedia.java | 37 +---------------- .../core/preferences/PlaybackPreferences.java | 25 +++++++++++ .../core/preferences/PlaybackSpeedHelper.java | 41 +++++++++++++++++++ .../core/preferences/UserPreferences.java | 25 +++-------- .../core/service/PlayerWidgetJobService.java | 4 +- .../core/service/playback/LocalPSMP.java | 8 ++-- .../service/playback/PlaybackService.java | 2 + .../antennapod/core/storage/DBUpgrader.java | 2 - .../antennapod/core/storage/PodDBAdapter.java | 8 +--- .../util/playback/PlaybackController.java | 3 +- 13 files changed, 95 insertions(+), 100 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackSpeedHelper.java 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 7c26cc484..9bf2374b9 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -11,8 +11,9 @@ import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; -import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.util.playback.Playable; @@ -83,7 +84,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { } float speed = 1.0f; if(controller.canSetPlaybackSpeed()) { - speed = UserPreferences.getPlaybackSpeed(controller.getMedia()); + speed = PlaybackSpeedHelper.getCurrentPlaybackSpeed(controller.getMedia()); } String speedStr = new DecimalFormat("0.00").format(speed); txtvPlaybackSpeed.setText(speedStr); @@ -132,7 +133,11 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { } } - storeNewMediaPlaybackSpeed(newSpeed); + try { + PlaybackPreferences.setCurrentlyPlayingTemporaryPlaybackSpeed(Float.parseFloat(newSpeed)); + } catch (NumberFormatException e) { + // Well this was awkward... + } UserPreferences.setPlaybackSpeed(newSpeed); controller.setPlaybackSpeed(Float.parseFloat(newSpeed)); onPositionObserverUpdate(); @@ -148,15 +153,4 @@ public class AudioplayerActivity extends MediaplayerInfoActivity { txtvPlaybackSpeed.setVisibility(View.VISIBLE); } } - - private void storeNewMediaPlaybackSpeed(String speed) { - Playable media = controller.getMedia(); - if (media instanceof FeedMedia) { - try { - ((FeedMedia) media).updateLastPlaybackSpeed(Float.parseFloat(speed)); - } catch (NumberFormatException e) { - // Well this was awkward... - } - } - } } 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 2f0caa982..4921ea70a 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -14,14 +14,12 @@ 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.PlaybackSpeedHelper; 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 static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - public class PlaybackControlsDialog extends DialogFragment { private static final float PLAYBACK_SPEED_STEP = 0.05f; private static final float DEFAULT_MIN_PLAYBACK_SPEED = 0.5f; @@ -217,6 +215,6 @@ public class PlaybackControlsDialog extends DialogFragment { media = controller.getMedia(); } - return UserPreferences.getPlaybackSpeed(media); + return PlaybackSpeedHelper.getCurrentPlaybackSpeed(media); } } 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 dcb16d192..b550669f3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -42,9 +42,9 @@ import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.event.FeedItemEvent; import de.danoeh.antennapod.core.event.QueueEvent; import de.danoeh.antennapod.core.feed.EventDistributor; -import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; @@ -66,7 +66,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_DELETE; import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_REMOVE_FROM_QUEUE; @@ -638,14 +637,7 @@ public class QueueFragment extends Fragment { if(queue.size() > 0) { long timeLeft = 0; for(FeedItem item : queue) { - float playbackSpeed = SPEED_USE_GLOBAL; - Feed feed = item.getFeed(); - if (feed != null) { - playbackSpeed = feed.getPreferences().getFeedPlaybackSpeed(); - } - if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = UserPreferences.getPlaybackSpeed(item.getMedia()); - } + float playbackSpeed = PlaybackSpeedHelper.getCurrentPlaybackSpeed(item.getMedia()); if(item.getMedia() != null) { timeLeft += (long) ((item.getMedia().getDuration() - item.getMedia().getPosition()) diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 10cf1f5c8..98beb6a85 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -58,7 +58,6 @@ public class FeedMedia extends FeedFile implements Playable { private Date playbackCompletionDate; private int startPosition = -1; private int playedDurationWhenStarted; - private float lastPlaybackSpeed = LAST_PLAYBACK_SPEED_UNSET; // if null: unknown, will be checked private Boolean hasEmbeddedPicture; @@ -95,11 +94,10 @@ public class FeedMedia extends FeedFile implements Playable { private FeedMedia(long id, FeedItem item, int duration, int position, long size, String mime_type, String file_url, String download_url, boolean downloaded, Date playbackCompletionDate, int played_duration, - Boolean hasEmbeddedPicture, long lastPlayedTime, float lastPlaybackSpeed) { + Boolean hasEmbeddedPicture, long lastPlayedTime) { this(id, item, duration, position, size, mime_type, file_url, download_url, downloaded, playbackCompletionDate, played_duration, lastPlayedTime); this.hasEmbeddedPicture = hasEmbeddedPicture; - this.lastPlaybackSpeed = lastPlaybackSpeed; } public static FeedMedia fromCursor(Cursor cursor) { @@ -114,7 +112,6 @@ public class FeedMedia extends FeedFile implements Playable { int indexDownloaded = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED); int indexPlayedDuration = cursor.getColumnIndex(PodDBAdapter.KEY_PLAYED_DURATION); int indexLastPlayedTime = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_PLAYED_TIME); - int indexLastPlaybackSpeed = cursor.getColumnIndex(PodDBAdapter.KEY_MEDIA_LAST_PLAYBACK_SPEED); long mediaId = cursor.getLong(indexId); Date playbackCompletionDate = null; @@ -149,8 +146,7 @@ public class FeedMedia extends FeedFile implements Playable { playbackCompletionDate, cursor.getInt(indexPlayedDuration), hasEmbeddedPicture, - cursor.getLong(indexLastPlayedTime), - cursor.getFloat(indexLastPlaybackSpeed) + cursor.getLong(indexLastPlayedTime) ); } @@ -630,33 +626,4 @@ public class FeedMedia extends FeedFile implements Playable { } return super.equals(o); } - - public float getLastPlaybackSpeed() { - return lastPlaybackSpeed; - } - - public void updateLastPlaybackSpeed(float newSpeed) { - lastPlaybackSpeed = newSpeed; - DBWriter.setFeedMediaPlaybackInformation(this); - } - - /** - * - * @return the current playback speed for the media, or the feed's configured speed - */ - public float getMediaPlaybackSpeed() { - float playbackSpeed = lastPlaybackSpeed; - - if (playbackSpeed == LAST_PLAYBACK_SPEED_UNSET) { - FeedItem item = getItem(); - if (item != null) { - Feed feed = item.getFeed(); - if (feed != null) { - playbackSpeed = feed.getPreferences().getFeedPlaybackSpeed(); - } - } - } - - return playbackSpeed; - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java index f2c0c8fe3..192674f0d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackPreferences.java @@ -11,6 +11,8 @@ import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.service.playback.PlayerStatus; import de.danoeh.antennapod.core.util.playback.Playable; +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + /** * Provides access to preferences set by the playback service. A private * instance of this class must first be instantiated via createInstance() or @@ -54,6 +56,13 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference */ private static final String PREF_CURRENT_PLAYER_STATUS = "de.danoeh.antennapod.preferences.currentPlayerStatus"; + /** + * A temporary playback speed which overrides the per-feed playback speed for the currently playing + * media. Considered unset if set to SPEED_USE_GLOBAL; + */ + private static final String PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED = "de.danoeh.antennapod.preferences.temporaryPlaybackSpeed"; + + /** * Value of PREF_CURRENTLY_PLAYING_MEDIA if no media is playing. */ @@ -112,6 +121,10 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference return prefs.getInt(PREF_CURRENT_PLAYER_STATUS, PLAYER_STATUS_OTHER); } + public static float getCurrentlyPlayingTemporaryPlaybackSpeed() { + return prefs.getFloat(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED, SPEED_USE_GLOBAL); + } + public static void writeNoMediaPlaying() { SharedPreferences.Editor editor = prefs.edit(); editor.putLong(PREF_CURRENTLY_PLAYING_MEDIA, NO_MEDIA_PLAYING); @@ -154,6 +167,18 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference editor.apply(); } + public static void setCurrentlyPlayingTemporaryPlaybackSpeed(float speed) { + SharedPreferences.Editor editor = prefs.edit(); + editor.putFloat(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED, speed); + editor.apply(); + } + + public static void clearCurrentlyPlayingTemporaryPlaybackSpeed() { + SharedPreferences.Editor editor = prefs.edit(); + editor.remove(PREF_CURRENTLY_PLAYING_TEMPORARY_PLAYBACK_SPEED); + editor.apply(); + } + private static int getCurrentPlayerStatusAsInt(PlayerStatus playerStatus) { int playerStatusAsInt; switch (playerStatus) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackSpeedHelper.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackSpeedHelper.java new file mode 100644 index 000000000..d48e41c3b --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/PlaybackSpeedHelper.java @@ -0,0 +1,41 @@ +package de.danoeh.antennapod.core.preferences; + +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.util.playback.Playable; + +import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; + +public class PlaybackSpeedHelper { + + /** + * Returns the currently configured playback speed for the specified media. + */ + public static float getCurrentPlaybackSpeed(Playable media) { + float playbackSpeed = SPEED_USE_GLOBAL; + MediaType mediaType = null; + + if (media != null) { + mediaType = media.getMediaType(); + playbackSpeed = PlaybackPreferences.getCurrentlyPlayingTemporaryPlaybackSpeed(); + + if (playbackSpeed == SPEED_USE_GLOBAL && media instanceof FeedMedia) { + FeedItem item = ((FeedMedia) media).getItem(); + if (item != null) { + Feed feed = item.getFeed(); + if (feed != null) { + playbackSpeed = feed.getPreferences().getFeedPlaybackSpeed(); + } + } + } + } + + if (playbackSpeed == SPEED_USE_GLOBAL) { + playbackSpeed = UserPreferences.getPlaybackSpeed(mediaType); + } + + return playbackSpeed; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index fc4166eb4..a2ce1fdcb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; -import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.service.download.ProxyConfig; @@ -32,12 +31,9 @@ import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; import de.danoeh.antennapod.core.util.Converter; -import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.SortOrder; import de.danoeh.antennapod.core.util.download.AutoUpdateManager; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - /** * Provides access to preferences set by the user in the settings screen. A * private instance of this class must first be instantiated via @@ -326,23 +322,12 @@ public class UserPreferences { return prefs.getBoolean(PREF_DELETE_REMOVES_FROM_QUEUE, false); } - public static float getPlaybackSpeed(Playable media) { - float playbackSpeed = SPEED_USE_GLOBAL; - if (media != null) { - if (media instanceof FeedMedia) { - playbackSpeed = ((FeedMedia) media).getMediaPlaybackSpeed(); - } - - if (playbackSpeed == SPEED_USE_GLOBAL && media.getMediaType() == MediaType.VIDEO) { - playbackSpeed = getVideoPlaybackSpeed(); - } + public static float getPlaybackSpeed(MediaType mediaType) { + if (mediaType == MediaType.VIDEO) { + return getVideoPlaybackSpeed(); + } else { + return getAudioPlaybackSpeed(); } - - if (playbackSpeed == SPEED_USE_GLOBAL) { - playbackSpeed = getAudioPlaybackSpeed(); - } - - return playbackSpeed; } private static float getAudioPlaybackSpeed() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java index a3eb92c0c..a34a1e2c3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java @@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.glide.ApGlideSettings; -import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; import de.danoeh.antennapod.core.receiver.PlayerWidget; import de.danoeh.antennapod.core.service.playback.PlaybackService; @@ -147,7 +147,7 @@ public class PlayerWidgetJobService extends SafeJobIntentService { progressString = getProgressString(playbackService.getCurrentPosition(), playbackService.getDuration(), playbackService.getCurrentPlaybackSpeed()); } else { - progressString = getProgressString(media.getPosition(), media.getDuration(), UserPreferences.getPlaybackSpeed(media)); + progressString = getProgressString(media.getPosition(), media.getDuration(), PlaybackSpeedHelper.getCurrentPlaybackSpeed(media)); } if (progressString != null) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index c982cb1e9..1584d29d2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -26,8 +26,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; -import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; import de.danoeh.antennapod.core.util.playback.AudioPlayer; @@ -35,8 +35,6 @@ import de.danoeh.antennapod.core.util.playback.IPlayer; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.VideoPlayer; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - /** * Manages the MediaPlayer object of the PlaybackService. */ @@ -245,7 +243,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { try { media.loadMetadata(); callback.onMediaChanged(false); - setPlaybackParams(UserPreferences.getPlaybackSpeed(media), UserPreferences.isSkipSilence()); + setPlaybackParams(PlaybackSpeedHelper.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence()); if (stream) { mediaPlayer.setDataSource(media.getStreamUrl()); } else if (media.getLocalMediaUrl() != null && new File(media.getLocalMediaUrl()).canRead()) { @@ -309,7 +307,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); - setPlaybackParams(UserPreferences.getPlaybackSpeed(media), UserPreferences.isSkipSilence()); + setPlaybackParams(PlaybackSpeedHelper.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence()); setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 2eb9c92e4..6fd219ac4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -959,6 +959,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ private void onPostPlayback(final Playable playable, boolean ended, boolean skipped, boolean playingNext) { + // Reset the temporary playback speed because it only referred to the last playable + PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed(); if (playable == null) { Log.e(TAG, "Cannot do post-playback processing: media was null"); return; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index 41b39deac..9ddebff0f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -294,8 +294,6 @@ class DBUpgrader { if (oldVersion < 1070400) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL); - db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA - + " ADD COLUMN " + PodDBAdapter.KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL DEFAULT " + LAST_PLAYBACK_SPEED_UNSET); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 4de83f548..0b315c247 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -36,7 +36,6 @@ import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.util.LongIntMap; -import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; // TODO Remove media column from feeditem table @@ -108,7 +107,6 @@ public class PodDBAdapter { public static final String KEY_INCLUDE_FILTER = "include_filter"; public static final String KEY_EXCLUDE_FILTER = "exclude_filter"; public static final String KEY_FEED_PLAYBACK_SPEED = "feed_playback_speed"; - public static final String KEY_MEDIA_LAST_PLAYBACK_SPEED = "last_playback_speed"; // Table names static final String TABLE_NAME_FEEDS = "Feeds"; @@ -163,8 +161,7 @@ public class PodDBAdapter { + KEY_FEEDITEM + " INTEGER," + KEY_PLAYED_DURATION + " INTEGER," + KEY_HAS_EMBEDDED_PICTURE + " INTEGER," - + KEY_LAST_PLAYED_TIME + " INTEGER," - + KEY_MEDIA_LAST_PLAYBACK_SPEED + " REAL DEFAULT " + LAST_PLAYBACK_SPEED_UNSET + ")"; + + KEY_LAST_PLAYED_TIME + " INTEGER" + ")"; private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE " + TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE @@ -435,7 +432,6 @@ public class PodDBAdapter { values.put(KEY_FILE_URL, media.getFile_url()); values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); - values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); if (media.getPlaybackCompletionDate() != null) { values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); @@ -461,7 +457,6 @@ public class PodDBAdapter { values.put(KEY_DURATION, media.getDuration()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); - values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, media.getLastPlaybackSpeed()); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { @@ -475,7 +470,6 @@ public class PodDBAdapter { values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); // Also reset stored playback speed for media - values.put(KEY_MEDIA_LAST_PLAYBACK_SPEED, LAST_PLAYBACK_SPEED_UNSET); db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 8328ea577..39888428f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java @@ -29,6 +29,7 @@ import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.service.playback.PlaybackServiceMediaPlayer; @@ -714,7 +715,7 @@ public class PlaybackController { if (playbackService != null && canSetPlaybackSpeed()) { return playbackService.getCurrentPlaybackSpeed(); } else { - return UserPreferences.getPlaybackSpeed(getMedia()); + return PlaybackSpeedHelper.getCurrentPlaybackSpeed(getMedia()); } } From 9539908f233e9c014d118f3d317a60a10b3433d9 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sat, 5 Oct 2019 02:18:30 +0200 Subject: [PATCH 20/22] Removed unused imports and unnecessary whitespace changes --- .../de/danoeh/antennapod/activity/AudioplayerActivity.java | 1 - .../de/danoeh/antennapod/activity/MediaplayerActivity.java | 2 -- .../de/danoeh/antennapod/dialog/PlaybackControlsDialog.java | 3 --- .../main/java/de/danoeh/antennapod/core/feed/FeedItem.java | 4 ---- .../main/java/de/danoeh/antennapod/core/feed/FeedMedia.java | 4 ---- .../java/de/danoeh/antennapod/core/storage/DBUpgrader.java | 1 - 6 files changed, 15 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 9bf2374b9..8eb0b1e0b 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -16,7 +16,6 @@ import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; -import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.dialog.VariableSpeedDialog; /** 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 7bfdc6fc6..566eea3f5 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -67,8 +67,6 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - /** * Provides general features which are both needed for playing audio and video 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 4921ea70a..f53dbe57a 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -8,11 +8,8 @@ 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.preferences.PlaybackSpeedHelper; import de.danoeh.antennapod.core.preferences.UserPreferences; diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 0f9ca0445..ecd34acff 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -15,13 +15,10 @@ import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.asynctask.ImageResource; -import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.ShownotesProvider; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - /** * Data Object for a XML message * @@ -487,5 +484,4 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, ImageR public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } - } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 98beb6a85..b1c2ff15a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -26,13 +26,9 @@ import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.ChapterUtils; import de.danoeh.antennapod.core.util.playback.Playable; -import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; - public class FeedMedia extends FeedFile implements Playable { private static final String TAG = "FeedMedia"; - public static final float LAST_PLAYBACK_SPEED_UNSET = SPEED_USE_GLOBAL; - public static final int FEEDFILETYPE_FEEDMEDIA = 2; public static final int PLAYABLE_TYPE_FEEDMEDIA = 1; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java index 9ddebff0f..575b8d2ac 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java @@ -8,7 +8,6 @@ import android.util.Log; import de.danoeh.antennapod.core.feed.FeedItem; -import static de.danoeh.antennapod.core.feed.FeedMedia.LAST_PLAYBACK_SPEED_UNSET; import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL; class DBUpgrader { From cab40dc4660499c23a829030dd313c3347d5b0aa Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sun, 6 Oct 2019 10:04:05 +0200 Subject: [PATCH 21/22] Removed unnecessary comment --- .../java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 0b315c247..5feedcebf 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -469,7 +469,6 @@ public class PodDBAdapter { ContentValues values = new ContentValues(); values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime()); values.put(KEY_PLAYED_DURATION, media.getPlayedDuration()); - // Also reset stored playback speed for media db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(media.getId())}); } else { From 138c29df0f9b0c8bcbfbcd74a31671b04cc06ff0 Mon Sep 17 00:00:00 2001 From: Jonas Kalderstam Date: Sun, 6 Oct 2019 10:06:11 +0200 Subject: [PATCH 22/22] Removed potentially misleading comment --- .../danoeh/antennapod/core/service/playback/PlaybackService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 6fd219ac4..848eacbd6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -959,7 +959,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ private void onPostPlayback(final Playable playable, boolean ended, boolean skipped, boolean playingNext) { - // Reset the temporary playback speed because it only referred to the last playable PlaybackPreferences.clearCurrentlyPlayingTemporaryPlaybackSpeed(); if (playable == null) { Log.e(TAG, "Cannot do post-playback processing: media was null");