From 0bd3b7265203aec5678400341e1b3ede55ba6024 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Thu, 27 Jun 2019 19:33:11 +0200 Subject: Mark entry point to allow volume adjustment per feed --- .../danoeh/antennapod/core/service/playback/LocalPSMP.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'core/src') 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 9a8353806..9c24e2f76 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 @@ -25,6 +25,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.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; @@ -311,6 +313,17 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { UserPreferences.setPlaybackSpeed(String.valueOf(speed)); } setPlaybackParams(speed, UserPreferences.isSkipSilence()); + // TODO MAX Here and everywhere else volume is adapted + Playable playable = getPlayable(); + if (playable instanceof FeedMedia) { + FeedMedia feedMedia = (FeedMedia) playable; + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + + // TODO MAX Check if this feed should have volume adjusted (e.g. louder than others) + + + } + setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { -- cgit v1.2.3 From c628fdfcfde1960d21cbbd5f3f6eb604827e0d47 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sat, 29 Jun 2019 11:55:59 +0200 Subject: Draft volume reduction settings per feed --- .../java/de/danoeh/antennapod/core/feed/Feed.java | 2 +- .../antennapod/core/feed/FeedPreferences.java | 28 +++++++++++++--- .../core/service/download/DownloadService.java | 2 +- .../core/service/playback/LocalPSMP.java | 37 +++++++++++++++------- .../danoeh/antennapod/core/storage/DBUpgrader.java | 1 + .../antennapod/core/storage/PodDBAdapter.java | 6 +++- core/src/main/res/values/arrays.xml | 12 +++++++ core/src/main/res/values/strings.xml | 4 +++ 8 files changed, 73 insertions(+), 19 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java index 5718c06c2..e01c35d0e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java @@ -160,7 +160,7 @@ public class Feed extends FeedFile implements ImageResource { */ public Feed(String url, String lastUpdate, String title, String username, String password) { this(url, lastUpdate, title); - preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, username, password); + preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, FeedPreferences.VolumeReductionSetting.OFF, username, password); } public static Feed fromCursor(Cursor cursor) { 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 3285ad7cb..62fb28100 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 @@ -26,18 +26,27 @@ public class FeedPreferences { NO } private AutoDeleteAction auto_delete_action; + + public enum VolumeReductionSetting { + OFF, + LIGHT, + HEAVY + } + private VolumeReductionSetting volumeReductionSetting; + private String username; private String password; - 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()); + public FeedPreferences(long feedID, boolean autoDownload, AutoDeleteAction auto_delete_action, VolumeReductionSetting volumeReductionSetting, String username, String password) { + this(feedID, autoDownload, true, auto_delete_action, volumeReductionSetting, username, password, new FeedFilter()); } - private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, String username, String password, @NonNull FeedFilter filter) { + private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, VolumeReductionSetting volumeReductionSetting, String username, String password, @NonNull FeedFilter filter) { this.feedID = feedID; this.autoDownload = autoDownload; this.keepUpdated = keepUpdated; this.auto_delete_action = auto_delete_action; + this.volumeReductionSetting = volumeReductionSetting; this.username = username; this.password = password; this.filter = filter; @@ -48,6 +57,7 @@ public class FeedPreferences { int indexAutoDownload = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DOWNLOAD); int indexAutoRefresh = cursor.getColumnIndex(PodDBAdapter.KEY_KEEP_UPDATED); int indexAutoDeleteAction = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DELETE_ACTION); + int indexVolumeReduction = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_VOLUME_REDUCTION); int indexUsername = cursor.getColumnIndex(PodDBAdapter.KEY_USERNAME); int indexPassword = cursor.getColumnIndex(PodDBAdapter.KEY_PASSWORD); int indexIncludeFilter = cursor.getColumnIndex(PodDBAdapter.KEY_INCLUDE_FILTER); @@ -58,11 +68,13 @@ public class FeedPreferences { boolean autoRefresh = cursor.getInt(indexAutoRefresh) > 0; int autoDeleteActionIndex = cursor.getInt(indexAutoDeleteAction); AutoDeleteAction autoDeleteAction = AutoDeleteAction.values()[autoDeleteActionIndex]; + int volumeReductionIndex = cursor.getInt(indexVolumeReduction); + VolumeReductionSetting volumeReductionSetting = VolumeReductionSetting.values()[volumeReductionIndex]; String username = cursor.getString(indexUsername); 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)); + return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, volumeReductionSetting, username, password, new FeedFilter(includeFilter, excludeFilter)); } /** @@ -138,10 +150,18 @@ public class FeedPreferences { return auto_delete_action; } + public VolumeReductionSetting getVolumeReductionSetting() { + return volumeReductionSetting; + } + public void setAutoDeleteAction(AutoDeleteAction auto_delete_action) { this.auto_delete_action = auto_delete_action; } + public void setVolumeReductionSetting(VolumeReductionSetting volumeReductionSetting) { + this.volumeReductionSetting = volumeReductionSetting; + } + public boolean getCurrentAutoDelete() { switch (auto_delete_action) { case GLOBAL: diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 787d465d8..1b94bb3c3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -764,7 +764,7 @@ public class DownloadService extends Service { feed.setId(request.getFeedfileId()); feed.setDownloaded(true); feed.setPreferences(new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, - request.getUsername(), request.getPassword())); + FeedPreferences.VolumeReductionSetting.OFF, request.getUsername(), request.getPassword())); feed.setPageNr(request.getArguments().getInt(DownloadRequester.REQUEST_ARG_PAGE_NR, 0)); DownloadError reason = 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 9c24e2f76..03704229b 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 @@ -313,18 +313,10 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { UserPreferences.setPlaybackSpeed(String.valueOf(speed)); } setPlaybackParams(speed, UserPreferences.isSkipSilence()); - // TODO MAX Here and everywhere else volume is adapted - Playable playable = getPlayable(); - if (playable instanceof FeedMedia) { - FeedMedia feedMedia = (FeedMedia) playable; - FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - // TODO MAX Check if this feed should have volume adjusted (e.g. louder than others) - - - } - - setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume()); + float leftVolume = UserPreferences.getLeftVolume(); + float rightVolume = UserPreferences.getRightVolume(); + setVolume(leftVolume, rightVolume); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { int newPosition = RewindAfterPauseUtils.calculatePositionWithRewind( @@ -344,8 +336,25 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { } } + private float getVolumeReductionFactor() { + Playable playable = getPlayable(); + if (playable instanceof FeedMedia) { + FeedMedia feedMedia = (FeedMedia) playable; + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + FeedPreferences.VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); + + // TODO maxbechtold These numbers should be tested + if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.LIGHT) { + return 0.4f; + } else if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.HEAVY) { + return 0.2f; + } + } + return 1.0f; + } + - /** + /** * Saves the current position and pauses playback. Note that, if audiofocus * is abandoned, the lockscreen controls will also disapear. *

@@ -681,6 +690,10 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { private void setVolumeSync(float volumeLeft, float volumeRight) { playerLock.lock(); if (media != null && media.getMediaType() == MediaType.AUDIO) { + // TODO maxbechtold does not apply to currently playing episode + float reductionFactor = getVolumeReductionFactor(); + volumeLeft *= reductionFactor; + volumeRight *= reductionFactor; mediaPlayer.setVolume(volumeLeft, volumeRight); Log.d(TAG, "Media player volume was set to " + volumeLeft + " " + volumeRight); } 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..1f6b430e0 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 @@ -193,6 +193,7 @@ class DBUpgrader { db.execSQL(sql); } if (oldVersion <= 17) { + // TODO maxbechtold Something like this for volume reduction db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0"); } 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 f7956372b..5fe18c3b4 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 @@ -103,6 +103,7 @@ public class PodDBAdapter { public static final String KEY_AUTO_DOWNLOAD = "auto_download"; public static final String KEY_KEEP_UPDATED = "keep_updated"; public static final String KEY_AUTO_DELETE_ACTION = "auto_delete_action"; + public static final String KEY_FEED_VOLUME_REDUCTION = "feed_volume_reduction"; public static final String KEY_PLAYED_DURATION = "played_duration"; public static final String KEY_USERNAME = "username"; public static final String KEY_PASSWORD = "password"; @@ -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_VOLUME_REDUCTION + " INTEGER DEFAULT 0)"; private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE " + TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE @@ -242,6 +244,7 @@ public class PodDBAdapter { TABLE_NAME_FEEDS + "." + KEY_HIDE, TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED, TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION, + TABLE_NAME_FEEDS + "." + KEY_FEED_VOLUME_REDUCTION, TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER, TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER }; @@ -404,6 +407,7 @@ public class PodDBAdapter { values.put(KEY_AUTO_DOWNLOAD, prefs.getAutoDownload()); values.put(KEY_KEEP_UPDATED, prefs.getKeepUpdated()); values.put(KEY_AUTO_DELETE_ACTION, prefs.getAutoDeleteAction().ordinal()); + values.put(KEY_FEED_VOLUME_REDUCTION, prefs.getVolumeReductionSetting().ordinal()); values.put(KEY_USERNAME, prefs.getUsername()); values.put(KEY_PASSWORD, prefs.getPassword()); values.put(KEY_INCLUDE_FILTER, prefs.getFilter().getIncludeFilter()); diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 0eaf0e5e7..8190a39e2 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -13,6 +13,18 @@ never + + @string/feed_volume_reduction_off + @string/feed_volume_reduction_light + @string/feed_volume_reduction_heavy + + + + off + light + heavy + + 0 15 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index a4084b76b..717d2302d 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -97,6 +97,10 @@ Apply to Previous Episodes The new Auto Download setting will automatically be applied to new episodes.\nDo you also want to apply it to previously published episodes? Auto Delete Episode + Volume Reduction + Off + Light + Heavy \u0020parallel downloads Global default Always -- cgit v1.2.3 From cd7f0245a51d11409fba012664bd1e63a1d86f68 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Fri, 5 Jul 2019 13:36:13 +0200 Subject: #3248 Slightly lessen light reduction --- .../java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'core/src') 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 03704229b..b4cd4b0d9 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 @@ -343,9 +343,10 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); FeedPreferences.VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); + // TODO maxbechtold Move this logic out of this class // TODO maxbechtold These numbers should be tested if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.LIGHT) { - return 0.4f; + return 0.5f; } else if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.HEAVY) { return 0.2f; } -- cgit v1.2.3 From 03074168ce7432d8c439e87241d151e6dbbc9bd6 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sun, 7 Jul 2019 11:42:52 +0200 Subject: #3248 Add unit test --- .../core/service/playback/FeedVolumeReduction.java | 16 +++++++++ .../core/service/playback/LocalPSMP.java | 39 ++++++++-------------- .../service/playback/FeedVolumeReductionTest.java | 35 +++++++++++++++++++ 3 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java create mode 100644 core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java new file mode 100644 index 000000000..c9e10efc3 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java @@ -0,0 +1,16 @@ +package de.danoeh.antennapod.core.service.playback; + +import de.danoeh.antennapod.core.feed.FeedPreferences; + +public class FeedVolumeReduction { + float getReductionFactor(FeedPreferences preferences) { + FeedPreferences.VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); + // TODO maxbechtold These numbers should be tested + if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.LIGHT) { + return 0.5f; + } else if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.HEAVY) { + return 0.2f; + } + return 1.0f; + } +} 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 b4cd4b0d9..5153dcddb 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 @@ -12,6 +12,8 @@ import android.util.Log; import android.util.Pair; import android.view.SurfaceHolder; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.FeedPreferences; import org.antennapod.audio.MediaPlayer; import java.io.File; @@ -25,8 +27,6 @@ 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.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; @@ -53,6 +53,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { private volatile boolean pausedBecauseOfTransientAudiofocusLoss; private volatile Pair videoSize; + private final FeedVolumeReduction feedVolumeReduction; + /** * Some asynchronous calls might change the state of the MediaPlayer object. Therefore calls in other threads * have to wait until these operations have finished. @@ -138,6 +140,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { super(context, callback); this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); this.playerLock = new PlayerLock(); + this.feedVolumeReduction = new FeedVolumeReduction(); this.startWhenPrepared = new AtomicBoolean(false); executor = new PlayerExecutor(); @@ -336,26 +339,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { } } - private float getVolumeReductionFactor() { - Playable playable = getPlayable(); - if (playable instanceof FeedMedia) { - FeedMedia feedMedia = (FeedMedia) playable; - FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - FeedPreferences.VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); - - // TODO maxbechtold Move this logic out of this class - // TODO maxbechtold These numbers should be tested - if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.LIGHT) { - return 0.5f; - } else if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.HEAVY) { - return 0.2f; - } - } - return 1.0f; - } - - /** + /** * Saves the current position and pauses playback. Note that, if audiofocus * is abandoned, the lockscreen controls will also disapear. *

@@ -691,10 +676,14 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { private void setVolumeSync(float volumeLeft, float volumeRight) { playerLock.lock(); if (media != null && media.getMediaType() == MediaType.AUDIO) { - // TODO maxbechtold does not apply to currently playing episode - float reductionFactor = getVolumeReductionFactor(); - volumeLeft *= reductionFactor; - volumeRight *= reductionFactor; + Playable playable = getPlayable(); + if (playable instanceof FeedMedia) { + FeedMedia feedMedia = (FeedMedia) playable; + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + float reductionFactor = feedVolumeReduction.getReductionFactor(preferences); + volumeLeft *= reductionFactor; + volumeRight *= reductionFactor; + } mediaPlayer.setVolume(volumeLeft, volumeRight); Log.d(TAG, "Media player volume was set to " + volumeLeft + " " + volumeRight); } diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java new file mode 100644 index 000000000..e8a2af413 --- /dev/null +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java @@ -0,0 +1,35 @@ +package de.danoeh.antennapod.core.service.playback; + +import de.danoeh.antennapod.core.feed.FeedPreferences; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class FeedVolumeReductionTest { + + @Test + public void noReductionIfTurnedOff() { + FeedPreferences feedPreferences = mock(FeedPreferences.class); + when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.OFF); + + FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); + float reductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); + assertEquals(1.0f, reductionFactor, 0.01f ); + } + + @Test + public void lightReductionYieldsHigherValueThanHeavyReduction() { + FeedPreferences feedPreferences = mock(FeedPreferences.class); + FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); + + when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.LIGHT); + float lightReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); + + when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.HEAVY); + float heavyReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); + + assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); + } +} \ No newline at end of file -- cgit v1.2.3 From fdf7ba25125f132b1e032f58836a62e0f8e92add Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sun, 7 Jul 2019 11:55:11 +0200 Subject: #3248 Add migration path --- core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java | 5 ++++- .../main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'core/src') 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 1f6b430e0..d9aec8649 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 @@ -193,7 +193,6 @@ class DBUpgrader { db.execSQL(sql); } if (oldVersion <= 17) { - // TODO maxbechtold Something like this for volume reduction db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0"); } @@ -289,6 +288,10 @@ class DBUpgrader { db.execSQL("DROP TABLE " + PodDBAdapter.TABLE_NAME_FEED_IMAGES); } + if (oldVersion < 1070296) { + db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + + " ADD COLUMN " + PodDBAdapter.KEY_FEED_VOLUME_REDUCTION + " INTEGER DEFAULT 0"); + } } } 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 5fe18c3b4..6f8aaf06e 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 @@ -1456,7 +1456,7 @@ public class PodDBAdapter { */ private static class PodDBHelper extends SQLiteOpenHelper { - private static final int VERSION = 1060596; + private static final int VERSION = 1070296; private final Context context; -- cgit v1.2.3 From 7f0e642069ef3c6cf6844d1a8f0c50d0fbe925f2 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Mon, 15 Jul 2019 11:56:06 +0200 Subject: #3248 Review findings --- .../antennapod/core/service/playback/FeedVolumeReductionTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'core/src') diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java index e8a2af413..3f2f9d597 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java @@ -3,7 +3,8 @@ package de.danoeh.antennapod.core.service.playback; import de.danoeh.antennapod.core.feed.FeedPreferences; import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -- cgit v1.2.3 From 759ce1b3574587b7045368c1ae476032b8b79942 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sat, 17 Aug 2019 15:46:08 +0200 Subject: #3248 Adapt volume for playing media if its volume reduction setting is changed --- .../service/playback/PlaybackVolumeAdaptor.java | 49 +++++ .../core/service/playback/PlaybackService.java | 28 ++- .../playback/PlaybackVolumeAdaptorTest.java | 230 +++++++++++++++++++++ 3 files changed, 305 insertions(+), 2 deletions(-) create mode 100644 core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java create mode 100644 core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java (limited to 'core/src') diff --git a/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java b/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java new file mode 100644 index 000000000..949f8c8cc --- /dev/null +++ b/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java @@ -0,0 +1,49 @@ +package de.danoeh.antennapod.core.service.playback; + +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.util.playback.Playable; + +class PlaybackVolumeAdaptor { + + public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting) { + Playable playable = mediaPlayer.getPlayable(); + boolean isFeedMedia = playable instanceof FeedMedia; + boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); + + if (isPlayableLoaded && isFeedMedia) { + adaptFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); + } + } + + private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { + if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + preferences.setVolumeReductionSetting(volumeReductionSetting); + + if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { + forceAdaptVolume(mediaPlayer); + } + } + } + + private static boolean isPlayableLoaded(PlayerStatus playerStatus) { + return playerStatus == PlayerStatus.PLAYING + || playerStatus == PlayerStatus.PAUSED + || playerStatus == PlayerStatus.SEEKING + || playerStatus == PlayerStatus.PREPARING + || playerStatus == PlayerStatus.PREPARED + || playerStatus == PlayerStatus.INITIALIZING; + } + + private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { + return affectedFeedIdentifier != null + && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); + } + + private static void forceAdaptVolume(PlaybackServiceMediaPlayer mediaPlayer) { + mediaPlayer.pause(false, false); + mediaPlayer.resume(); + } + +} 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 ab1edc8e9..632dfd50e 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 @@ -12,7 +12,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; @@ -43,6 +42,7 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -54,6 +54,7 @@ import de.danoeh.antennapod.core.feed.Chapter; 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.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.SearchResult; import de.danoeh.antennapod.core.glide.ApGlideSettings; @@ -66,7 +67,6 @@ 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.FeedSearcher; -import de.danoeh.antennapod.core.util.IntList; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.QueueAccess; @@ -80,6 +80,7 @@ import org.greenrobot.eventbus.EventBus; * Controls the MediaPlayer that plays a FeedMedia-file */ public class PlaybackService extends MediaBrowserServiceCompat { + /** * Logging tag */ @@ -131,6 +132,12 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ public static final String ACTION_PAUSE_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.pausePlayCurrentEpisode"; + /** + * If the PlaybackService receives this action, it will try to apply the supplied volume reduction setting. + */ + public static final String ACTION_VOLUME_REDUCTION_CHANGED = "action.de.danoeh.antennapod.core.service.volumedReductionChanged"; + public static final String EXTRA_VOLUME_REDUCTION_SETTING = "PlaybackService.VolumeReductionSettingExtra"; + public static final String EXTRA_VOLUME_REDUCTION_AFFECTED_FEED = "PlaybackService.VolumeReductionSettingAffectedFeed"; /** * If the PlaybackService receives this action, it will resume playback. @@ -279,6 +286,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter(ACTION_SKIP_CURRENT_EPISODE)); registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter(ACTION_PAUSE_PLAY_CURRENT_EPISODE)); registerReceiver(pauseResumeCurrentEpisodeReceiver, new IntentFilter(ACTION_RESUME_PLAY_CURRENT_EPISODE)); + registerReceiver(volumeReductionChangedReceiver, new IntentFilter(ACTION_VOLUME_REDUCTION_CHANGED)); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); flavorHelper = new PlaybackServiceFlavorHelper(PlaybackService.this, flavorHelperCallback); @@ -1517,6 +1525,22 @@ public class PlaybackService extends MediaBrowserServiceCompat { } }; + private final BroadcastReceiver volumeReductionChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (TextUtils.equals(intent.getAction(), ACTION_VOLUME_REDUCTION_CHANGED)) { + Log.d(TAG, "Received ACTION_VOLUME_REDUCTION_CHANGED intent"); + + String affectedFeed = intent.getStringExtra(EXTRA_VOLUME_REDUCTION_AFFECTED_FEED); + Serializable volumeReductionExtra = intent.getSerializableExtra(EXTRA_VOLUME_REDUCTION_SETTING); + FeedPreferences.VolumeReductionSetting volumeReductionSetting = (FeedPreferences.VolumeReductionSetting) volumeReductionExtra; + + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, affectedFeed, volumeReductionSetting); + } + } + }; + public static MediaType getCurrentMediaType() { return currentMediaType; } diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java new file mode 100644 index 000000000..9036624d8 --- /dev/null +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java @@ -0,0 +1,230 @@ +package de.danoeh.antennapod.core.service.playback; + +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.FeedPreferences; +import de.danoeh.antennapod.core.feed.FeedPreferences.VolumeReductionSetting; +import de.danoeh.antennapod.core.util.playback.Playable; +import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class PlaybackVolumeAdaptorTest { + + private static final String FEED_ID = "feedId"; + + private PlaybackServiceMediaPlayer mediaPlayer; + + @Before + public void setUp() throws Exception { + mediaPlayer = mock(PlaybackServiceMediaPlayer.class); + } + + @Test + public void noChangeIfNoFeedMediaPlaying() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); + + Playable noFeedMedia = mock(Playable.class); + when(mediaPlayer.getPlayable()).thenReturn(noFeedMedia); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsError() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.ERROR); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsIndeterminate() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INDETERMINATE); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsStopped() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.STOPPED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayableIsNoItemOfAffectedFeed() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + Feed feed = mockFeed(feedMedia, FEED_ID); + when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPaused() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPrepared() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsInitializing() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INITIALIZING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPreparing() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsSeeking() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.SEEKING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void adaptsPreferencesAndForcesVolumeChangeForLoadedFeedMediaIfPlayerStatusIsPlaying() { + PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.HEAVY); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.HEAVY); + + verify(mediaPlayer, times(1)).pause(false, false); + verify(mediaPlayer, times(1)).resume(); + } + + private FeedPreferences mockFeedPreferences(FeedMedia feedMedia, String feedId) { + Feed feed = mockFeed(feedMedia, feedId); + FeedPreferences feedPreferences = mock(FeedPreferences.class); + when(feed.getPreferences()).thenReturn(feedPreferences); + return feedPreferences; + } + + private Feed mockFeed(FeedMedia feedMedia, String feedId) { + FeedItem feedItem = mock(FeedItem.class); + when(feedMedia.getItem()).thenReturn(feedItem); + Feed feed = mock(Feed.class); + when(feed.getIdentifyingValue()).thenReturn(feedId); + when(feedItem.getFeed()).thenReturn(feed); + return feed; + } +} -- cgit v1.2.3 From 5f43acbffe7d717442a8c2c8f6bfc63e6466430a Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sun, 18 Aug 2019 14:25:10 +0200 Subject: Attempt to fix circle-ci build to allow assembling play flavor --- .../service/playback/PlaybackVolumeAdaptor.java | 49 ---------------------- .../service/playback/PlaybackVolumeAdaptor.java | 49 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 49 deletions(-) delete mode 100644 core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java (limited to 'core/src') diff --git a/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java b/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java deleted file mode 100644 index 949f8c8cc..000000000 --- a/core/src/free/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.util.playback.Playable; - -class PlaybackVolumeAdaptor { - - public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting) { - Playable playable = mediaPlayer.getPlayable(); - boolean isFeedMedia = playable instanceof FeedMedia; - boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); - - if (isPlayableLoaded && isFeedMedia) { - adaptFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); - } - } - - private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { - if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { - FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - preferences.setVolumeReductionSetting(volumeReductionSetting); - - if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { - forceAdaptVolume(mediaPlayer); - } - } - } - - private static boolean isPlayableLoaded(PlayerStatus playerStatus) { - return playerStatus == PlayerStatus.PLAYING - || playerStatus == PlayerStatus.PAUSED - || playerStatus == PlayerStatus.SEEKING - || playerStatus == PlayerStatus.PREPARING - || playerStatus == PlayerStatus.PREPARED - || playerStatus == PlayerStatus.INITIALIZING; - } - - private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { - return affectedFeedIdentifier != null - && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); - } - - private static void forceAdaptVolume(PlaybackServiceMediaPlayer mediaPlayer) { - mediaPlayer.pause(false, false); - mediaPlayer.resume(); - } - -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java new file mode 100644 index 000000000..949f8c8cc --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java @@ -0,0 +1,49 @@ +package de.danoeh.antennapod.core.service.playback; + +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.util.playback.Playable; + +class PlaybackVolumeAdaptor { + + public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting) { + Playable playable = mediaPlayer.getPlayable(); + boolean isFeedMedia = playable instanceof FeedMedia; + boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); + + if (isPlayableLoaded && isFeedMedia) { + adaptFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); + } + } + + private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { + if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + preferences.setVolumeReductionSetting(volumeReductionSetting); + + if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { + forceAdaptVolume(mediaPlayer); + } + } + } + + private static boolean isPlayableLoaded(PlayerStatus playerStatus) { + return playerStatus == PlayerStatus.PLAYING + || playerStatus == PlayerStatus.PAUSED + || playerStatus == PlayerStatus.SEEKING + || playerStatus == PlayerStatus.PREPARING + || playerStatus == PlayerStatus.PREPARED + || playerStatus == PlayerStatus.INITIALIZING; + } + + private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { + return affectedFeedIdentifier != null + && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); + } + + private static void forceAdaptVolume(PlaybackServiceMediaPlayer mediaPlayer) { + mediaPlayer.pause(false, false); + mediaPlayer.resume(); + } + +} -- cgit v1.2.3 From b6fc27fe12e48f4de5c170e7edeb06ccb5bf6419 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Mon, 26 Aug 2019 11:09:39 +0200 Subject: #3248 Refactor enum mapping for more refactoring safety --- .../java/de/danoeh/antennapod/core/feed/Feed.java | 2 +- .../antennapod/core/feed/FeedPreferences.java | 9 +--- .../core/feed/VolumeReductionSetting.java | 26 ++++++++++++ .../core/service/download/DownloadService.java | 3 +- .../core/service/playback/FeedVolumeReduction.java | 8 ++-- .../core/service/playback/PlaybackService.java | 4 +- .../service/playback/PlaybackVolumeAdaptor.java | 5 ++- .../antennapod/core/storage/PodDBAdapter.java | 2 +- .../core/feed/VolumeReductionSettingTest.java | 48 ++++++++++++++++++++++ .../service/playback/FeedVolumeReductionTest.java | 7 ++-- .../playback/PlaybackVolumeAdaptorTest.java | 2 +- 11 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java create mode 100644 core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java index e01c35d0e..2a535b2c4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java @@ -160,7 +160,7 @@ public class Feed extends FeedFile implements ImageResource { */ public Feed(String url, String lastUpdate, String title, String username, String password) { this(url, lastUpdate, title); - preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, FeedPreferences.VolumeReductionSetting.OFF, username, password); + preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, VolumeReductionSetting.OFF, username, password); } public static Feed fromCursor(Cursor cursor) { 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 62fb28100..eaafab322 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 @@ -27,11 +27,6 @@ public class FeedPreferences { } private AutoDeleteAction auto_delete_action; - public enum VolumeReductionSetting { - OFF, - LIGHT, - HEAVY - } private VolumeReductionSetting volumeReductionSetting; private String username; @@ -68,8 +63,8 @@ public class FeedPreferences { boolean autoRefresh = cursor.getInt(indexAutoRefresh) > 0; int autoDeleteActionIndex = cursor.getInt(indexAutoDeleteAction); AutoDeleteAction autoDeleteAction = AutoDeleteAction.values()[autoDeleteActionIndex]; - int volumeReductionIndex = cursor.getInt(indexVolumeReduction); - VolumeReductionSetting volumeReductionSetting = VolumeReductionSetting.values()[volumeReductionIndex]; + int volumeReductionValue = cursor.getInt(indexVolumeReduction); + VolumeReductionSetting volumeReductionSetting = VolumeReductionSetting.fromInteger(volumeReductionValue); String username = cursor.getString(indexUsername); String password = cursor.getString(indexPassword); String includeFilter = cursor.getString(indexIncludeFilter); diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java new file mode 100644 index 000000000..ec6db4872 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java @@ -0,0 +1,26 @@ +package de.danoeh.antennapod.core.feed; + +public enum VolumeReductionSetting { + OFF(0), + LIGHT(1), + HEAVY(2); + + private final int value; + + VolumeReductionSetting(int value) { + this.value = value; + } + + public static VolumeReductionSetting fromInteger(int value) { + for (VolumeReductionSetting setting : values()) { + if (setting.value == value) { + return setting; + } + } + throw new IllegalArgumentException("Cannot map value to VolumeReductionSetting: " + value); + } + + public int toInteger() { + return value; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 1b94bb3c3..59222aa11 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -19,6 +19,7 @@ import android.util.Log; import android.util.Pair; import android.webkit.URLUtil; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import org.apache.commons.io.FileUtils; import org.greenrobot.eventbus.EventBus; import org.xml.sax.SAXException; @@ -764,7 +765,7 @@ public class DownloadService extends Service { feed.setId(request.getFeedfileId()); feed.setDownloaded(true); feed.setPreferences(new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, - FeedPreferences.VolumeReductionSetting.OFF, request.getUsername(), request.getPassword())); + VolumeReductionSetting.OFF, request.getUsername(), request.getPassword())); feed.setPageNr(request.getArguments().getInt(DownloadRequester.REQUEST_ARG_PAGE_NR, 0)); DownloadError reason = null; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java index c9e10efc3..608e8375b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java @@ -1,14 +1,14 @@ package de.danoeh.antennapod.core.service.playback; import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; public class FeedVolumeReduction { float getReductionFactor(FeedPreferences preferences) { - FeedPreferences.VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); - // TODO maxbechtold These numbers should be tested - if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.LIGHT) { + VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); + if (volumeReductionSetting == VolumeReductionSetting.LIGHT) { return 0.5f; - } else if (volumeReductionSetting == FeedPreferences.VolumeReductionSetting.HEAVY) { + } else if (volumeReductionSetting == VolumeReductionSetting.HEAVY) { return 0.2f; } return 1.0f; 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 632dfd50e..d90a86bab 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 @@ -54,9 +54,9 @@ import de.danoeh.antennapod.core.feed.Chapter; 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.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.SearchResult; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; @@ -1533,7 +1533,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { String affectedFeed = intent.getStringExtra(EXTRA_VOLUME_REDUCTION_AFFECTED_FEED); Serializable volumeReductionExtra = intent.getSerializableExtra(EXTRA_VOLUME_REDUCTION_SETTING); - FeedPreferences.VolumeReductionSetting volumeReductionSetting = (FeedPreferences.VolumeReductionSetting) volumeReductionExtra; + VolumeReductionSetting volumeReductionSetting = (VolumeReductionSetting) volumeReductionExtra; PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, affectedFeed, volumeReductionSetting); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java index 949f8c8cc..970abff33 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java @@ -2,11 +2,12 @@ package de.danoeh.antennapod.core.service.playback; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import de.danoeh.antennapod.core.util.playback.Playable; class PlaybackVolumeAdaptor { - public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting) { + public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting) { Playable playable = mediaPlayer.getPlayable(); boolean isFeedMedia = playable instanceof FeedMedia; boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); @@ -16,7 +17,7 @@ class PlaybackVolumeAdaptor { } } - private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, FeedPreferences.VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { + private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); preferences.setVolumeReductionSetting(volumeReductionSetting); 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 6f8aaf06e..566c280eb 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 @@ -407,7 +407,7 @@ public class PodDBAdapter { values.put(KEY_AUTO_DOWNLOAD, prefs.getAutoDownload()); values.put(KEY_KEEP_UPDATED, prefs.getKeepUpdated()); values.put(KEY_AUTO_DELETE_ACTION, prefs.getAutoDeleteAction().ordinal()); - values.put(KEY_FEED_VOLUME_REDUCTION, prefs.getVolumeReductionSetting().ordinal()); + values.put(KEY_FEED_VOLUME_REDUCTION, prefs.getVolumeReductionSetting().toInteger()); values.put(KEY_USERNAME, prefs.getUsername()); values.put(KEY_PASSWORD, prefs.getPassword()); values.put(KEY_INCLUDE_FILTER, prefs.getFilter().getIncludeFilter()); diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java new file mode 100644 index 000000000..26c2132fe --- /dev/null +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java @@ -0,0 +1,48 @@ +package de.danoeh.antennapod.core.feed; + + +import org.junit.Test; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class VolumeReductionSettingTest { + + @Test + public void mapOffToInteger() { + VolumeReductionSetting setting = VolumeReductionSetting.OFF; + assertThat(setting.toInteger(), is(equalTo(0))); + } + + @Test + public void mapLightToInteger() { + VolumeReductionSetting setting = VolumeReductionSetting.LIGHT; + + assertThat(setting.toInteger(), is(equalTo(1))); + } + + @Test + public void mapHeavyToInteger() { + VolumeReductionSetting setting = VolumeReductionSetting.HEAVY; + + assertThat(setting.toInteger(), is(equalTo(2))); + } + + @Test + public void mapIntegerToVolumeReductionSetting() { + assertThat(VolumeReductionSetting.fromInteger(0), is(equalTo(VolumeReductionSetting.OFF))); + assertThat(VolumeReductionSetting.fromInteger(1), is(equalTo(VolumeReductionSetting.LIGHT))); + assertThat(VolumeReductionSetting.fromInteger(2), is(equalTo(VolumeReductionSetting.HEAVY))); + } + + @Test(expected = IllegalArgumentException.class) + public void cannotMapNegativeValues() { + VolumeReductionSetting.fromInteger(-1); + } + + @Test(expected = IllegalArgumentException.class) + public void cannotMapValuesOutOfRange() { + VolumeReductionSetting.fromInteger(3); + } +} \ No newline at end of file diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java index 3f2f9d597..109b361fe 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.core.service.playback; import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -13,7 +14,7 @@ public class FeedVolumeReductionTest { @Test public void noReductionIfTurnedOff() { FeedPreferences feedPreferences = mock(FeedPreferences.class); - when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.OFF); + when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.OFF); FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); float reductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); @@ -25,10 +26,10 @@ public class FeedVolumeReductionTest { FeedPreferences feedPreferences = mock(FeedPreferences.class); FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); - when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.LIGHT); + when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.LIGHT); float lightReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); - when(feedPreferences.getVolumeReductionSetting()).thenReturn(FeedPreferences.VolumeReductionSetting.HEAVY); + when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.HEAVY); float heavyReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java index 9036624d8..501719ebe 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java @@ -4,7 +4,7 @@ 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.FeedPreferences; -import de.danoeh.antennapod.core.feed.FeedPreferences.VolumeReductionSetting; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import de.danoeh.antennapod.core.util.playback.Playable; import org.junit.Before; import org.junit.Test; -- cgit v1.2.3 From f9cf013b16dc98b5b1ff333c363317d350c8dc24 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Thu, 17 Oct 2019 09:40:18 +0200 Subject: #3248 Enable volume reduction for video media --- .../java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'core/src') 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 a4c9ba31c..a09d6cb19 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 @@ -16,6 +16,7 @@ import org.antennapod.audio.MediaPlayer; import java.io.File; import java.io.IOException; +import java.util.EnumSet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; @@ -670,7 +671,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { */ private void setVolumeSync(float volumeLeft, float volumeRight) { playerLock.lock(); - if (media != null && media.getMediaType() == MediaType.AUDIO) { + if (media != null && EnumSet.of(MediaType.AUDIO, MediaType.VIDEO).contains(media.getMediaType())) { Playable playable = getPlayable(); if (playable instanceof FeedMedia) { FeedMedia feedMedia = (FeedMedia) playable; -- cgit v1.2.3 From 3bc55a09b1371fbb6086e290369cfe048e1df25e Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Thu, 17 Oct 2019 09:56:04 +0200 Subject: #3248 Rename PlaybackVolumeAdaptor -> ..Updater --- .../core/service/playback/PlaybackService.java | 4 +- .../service/playback/PlaybackVolumeAdaptor.java | 50 ----- .../service/playback/PlaybackVolumeUpdater.java | 50 +++++ .../playback/PlaybackVolumeAdaptorTest.java | 230 --------------------- .../playback/PlaybackVolumeUpdaterTest.java | 230 +++++++++++++++++++++ 5 files changed, 282 insertions(+), 282 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java delete mode 100644 core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java create mode 100644 core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java (limited to 'core/src') 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 f8990328f..d444875ad 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 @@ -1482,8 +1482,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { Serializable volumeReductionExtra = intent.getSerializableExtra(EXTRA_VOLUME_REDUCTION_SETTING); VolumeReductionSetting volumeReductionSetting = (VolumeReductionSetting) volumeReductionExtra; - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, affectedFeed, volumeReductionSetting); + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, affectedFeed, volumeReductionSetting); } } }; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java deleted file mode 100644 index 970abff33..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptor.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; -import de.danoeh.antennapod.core.util.playback.Playable; - -class PlaybackVolumeAdaptor { - - public void adaptVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting) { - Playable playable = mediaPlayer.getPlayable(); - boolean isFeedMedia = playable instanceof FeedMedia; - boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); - - if (isPlayableLoaded && isFeedMedia) { - adaptFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); - } - } - - private void adaptFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { - if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { - FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - preferences.setVolumeReductionSetting(volumeReductionSetting); - - if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { - forceAdaptVolume(mediaPlayer); - } - } - } - - private static boolean isPlayableLoaded(PlayerStatus playerStatus) { - return playerStatus == PlayerStatus.PLAYING - || playerStatus == PlayerStatus.PAUSED - || playerStatus == PlayerStatus.SEEKING - || playerStatus == PlayerStatus.PREPARING - || playerStatus == PlayerStatus.PREPARED - || playerStatus == PlayerStatus.INITIALIZING; - } - - private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { - return affectedFeedIdentifier != null - && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); - } - - private static void forceAdaptVolume(PlaybackServiceMediaPlayer mediaPlayer) { - mediaPlayer.pause(false, false); - mediaPlayer.resume(); - } - -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java new file mode 100644 index 000000000..aff742105 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java @@ -0,0 +1,50 @@ +package de.danoeh.antennapod.core.service.playback; + +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.util.playback.Playable; + +class PlaybackVolumeUpdater { + + public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting) { + Playable playable = mediaPlayer.getPlayable(); + boolean isFeedMedia = playable instanceof FeedMedia; + boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); + + if (isFeedMedia && isPlayableLoaded) { + updateFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); + } + } + + private void updateFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { + if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + preferences.setVolumeReductionSetting(volumeReductionSetting); + + if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { + forceUpdateVolume(mediaPlayer); + } + } + } + + private static boolean isPlayableLoaded(PlayerStatus playerStatus) { + return playerStatus == PlayerStatus.PLAYING + || playerStatus == PlayerStatus.PAUSED + || playerStatus == PlayerStatus.SEEKING + || playerStatus == PlayerStatus.PREPARING + || playerStatus == PlayerStatus.PREPARED + || playerStatus == PlayerStatus.INITIALIZING; + } + + private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { + return affectedFeedIdentifier != null + && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); + } + + private void forceUpdateVolume(PlaybackServiceMediaPlayer mediaPlayer) { + mediaPlayer.pause(false, false); + mediaPlayer.resume(); + } + +} diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java deleted file mode 100644 index 501719ebe..000000000 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeAdaptorTest.java +++ /dev/null @@ -1,230 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -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.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; -import de.danoeh.antennapod.core.util.playback.Playable; -import org.junit.Before; -import org.junit.Test; - -import static org.mockito.Mockito.anyBoolean; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class PlaybackVolumeAdaptorTest { - - private static final String FEED_ID = "feedId"; - - private PlaybackServiceMediaPlayer mediaPlayer; - - @Before - public void setUp() throws Exception { - mediaPlayer = mock(PlaybackServiceMediaPlayer.class); - } - - @Test - public void noChangeIfNoFeedMediaPlaying() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); - - Playable noFeedMedia = mock(Playable.class); - when(mediaPlayer.getPlayable()).thenReturn(noFeedMedia); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void noChangeIfPlayerStatusIsError() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.ERROR); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void noChangeIfPlayerStatusIsIndeterminate() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INDETERMINATE); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void noChangeIfPlayerStatusIsStopped() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.STOPPED); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void noChangeIfPlayableIsNoItemOfAffectedFeed() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - Feed feed = mockFeed(feedMedia, FEED_ID); - when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPaused() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPrepared() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARED); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsInitializing() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INITIALIZING); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsPreparing() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARING); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesForLoadedFeedMediaIfPlayerStatusIsSeeking() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.SEEKING); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); - - verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); - verify(mediaPlayer, never()).resume(); - } - - @Test - public void adaptsPreferencesAndForcesVolumeChangeForLoadedFeedMediaIfPlayerStatusIsPlaying() { - PlaybackVolumeAdaptor playbackVolumeAdaptor = new PlaybackVolumeAdaptor(); - - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); - - FeedMedia feedMedia = mock(FeedMedia.class); - when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - - playbackVolumeAdaptor.adaptVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.HEAVY); - - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.HEAVY); - - verify(mediaPlayer, times(1)).pause(false, false); - verify(mediaPlayer, times(1)).resume(); - } - - private FeedPreferences mockFeedPreferences(FeedMedia feedMedia, String feedId) { - Feed feed = mockFeed(feedMedia, feedId); - FeedPreferences feedPreferences = mock(FeedPreferences.class); - when(feed.getPreferences()).thenReturn(feedPreferences); - return feedPreferences; - } - - private Feed mockFeed(FeedMedia feedMedia, String feedId) { - FeedItem feedItem = mock(FeedItem.class); - when(feedMedia.getItem()).thenReturn(feedItem); - Feed feed = mock(Feed.class); - when(feed.getIdentifyingValue()).thenReturn(feedId); - when(feedItem.getFeed()).thenReturn(feed); - return feed; - } -} diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java new file mode 100644 index 000000000..4ebe4e5ba --- /dev/null +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java @@ -0,0 +1,230 @@ +package de.danoeh.antennapod.core.service.playback; + +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.FeedPreferences; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.util.playback.Playable; +import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.anyBoolean; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class PlaybackVolumeUpdaterTest { + + private static final String FEED_ID = "feedId"; + + private PlaybackServiceMediaPlayer mediaPlayer; + + @Before + public void setUp() throws Exception { + mediaPlayer = mock(PlaybackServiceMediaPlayer.class); + } + + @Test + public void noChangeIfNoFeedMediaPlaying() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); + + Playable noFeedMedia = mock(Playable.class); + when(mediaPlayer.getPlayable()).thenReturn(noFeedMedia); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsError() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.ERROR); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsIndeterminate() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INDETERMINATE); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayerStatusIsStopped() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.STOPPED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void noChangeIfPlayableIsNoItemOfAffectedFeed() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + Feed feed = mockFeed(feedMedia, FEED_ID); + when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesForLoadedFeedMediaIfPlayerStatusIsPaused() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesForLoadedFeedMediaIfPlayerStatusIsPrepared() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARED); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesForLoadedFeedMediaIfPlayerStatusIsInitializing() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INITIALIZING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesForLoadedFeedMediaIfPlayerStatusIsPreparing() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesForLoadedFeedMediaIfPlayerStatusIsSeeking() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.SEEKING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + + verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); + verify(mediaPlayer, never()).resume(); + } + + @Test + public void updatesPreferencesAndForcesVolumeChangeForLoadedFeedMediaIfPlayerStatusIsPlaying() { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + + when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); + + FeedMedia feedMedia = mock(FeedMedia.class); + when(mediaPlayer.getPlayable()).thenReturn(feedMedia); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.HEAVY); + + verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.HEAVY); + + verify(mediaPlayer, times(1)).pause(false, false); + verify(mediaPlayer, times(1)).resume(); + } + + private FeedPreferences mockFeedPreferences(FeedMedia feedMedia, String feedId) { + Feed feed = mockFeed(feedMedia, feedId); + FeedPreferences feedPreferences = mock(FeedPreferences.class); + when(feed.getPreferences()).thenReturn(feedPreferences); + return feedPreferences; + } + + private Feed mockFeed(FeedMedia feedMedia, String feedId) { + FeedItem feedItem = mock(FeedItem.class); + when(feedMedia.getItem()).thenReturn(feedItem); + Feed feed = mock(Feed.class); + when(feed.getIdentifyingValue()).thenReturn(feedId); + when(feedItem.getFeed()).thenReturn(feed); + return feed; + } +} -- cgit v1.2.3 From 14db72ac3532f2258df301074bc781d691d68658 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Thu, 17 Oct 2019 11:54:11 +0200 Subject: #3248 Merge FeedVolumeReduction into VolumeReductionSetting --- .../core/feed/VolumeReductionSetting.java | 14 +++++--- .../core/service/playback/FeedVolumeReduction.java | 16 ---------- .../core/service/playback/LocalPSMP.java | 7 ++-- .../core/feed/VolumeReductionSettingTest.java | 18 ++++++++++- .../service/playback/FeedVolumeReductionTest.java | 37 ---------------------- 5 files changed, 30 insertions(+), 62 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java delete mode 100644 core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java index ec6db4872..53808580a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java @@ -1,14 +1,16 @@ package de.danoeh.antennapod.core.feed; public enum VolumeReductionSetting { - OFF(0), - LIGHT(1), - HEAVY(2); + OFF(0, 1.0f), + LIGHT(1, 0.5f), + HEAVY(2, 0.2f); private final int value; + private float reductionFactor; - VolumeReductionSetting(int value) { + VolumeReductionSetting(int value, float reductionFactor) { this.value = value; + this.reductionFactor = reductionFactor; } public static VolumeReductionSetting fromInteger(int value) { @@ -23,4 +25,8 @@ public enum VolumeReductionSetting { public int toInteger() { return value; } + + public float getReductionFactor() { + return reductionFactor; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java deleted file mode 100644 index 608e8375b..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReduction.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; - -public class FeedVolumeReduction { - float getReductionFactor(FeedPreferences preferences) { - VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); - if (volumeReductionSetting == VolumeReductionSetting.LIGHT) { - return 0.5f; - } else if (volumeReductionSetting == VolumeReductionSetting.HEAVY) { - return 0.2f; - } - return 1.0f; - } -} 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 a09d6cb19..e5dd292f0 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 @@ -29,6 +29,7 @@ import java.util.concurrent.locks.ReentrantLock; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; import de.danoeh.antennapod.core.util.playback.AudioPlayer; @@ -55,8 +56,6 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { private volatile boolean pausedBecauseOfTransientAudiofocusLoss; private volatile Pair videoSize; - private final FeedVolumeReduction feedVolumeReduction; - /** * Some asynchronous calls might change the state of the MediaPlayer object. Therefore calls in other threads * have to wait until these operations have finished. @@ -142,7 +141,6 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { super(context, callback); this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); this.playerLock = new PlayerLock(); - this.feedVolumeReduction = new FeedVolumeReduction(); this.startWhenPrepared = new AtomicBoolean(false); executor = new PlayerExecutor(); @@ -676,7 +674,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (playable instanceof FeedMedia) { FeedMedia feedMedia = (FeedMedia) playable; FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - float reductionFactor = feedVolumeReduction.getReductionFactor(preferences); + VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); + float reductionFactor = volumeReductionSetting.getReductionFactor(); volumeLeft *= reductionFactor; volumeRight *= reductionFactor; } diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java index 26c2132fe..a97fb6f20 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java @@ -1,11 +1,12 @@ package de.danoeh.antennapod.core.feed; - import org.junit.Test; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; public class VolumeReductionSettingTest { @@ -45,4 +46,19 @@ public class VolumeReductionSettingTest { public void cannotMapValuesOutOfRange() { VolumeReductionSetting.fromInteger(3); } + + @Test + public void noReductionIfTurnedOff() { + float reductionFactor = VolumeReductionSetting.OFF.getReductionFactor(); + assertEquals(1.0f, reductionFactor, 0.01f); + } + + @Test + public void lightReductionYieldsHigherValueThanHeavyReduction() { + float lightReductionFactor = VolumeReductionSetting.LIGHT.getReductionFactor(); + + float heavyReductionFactor = VolumeReductionSetting.HEAVY.getReductionFactor(); + + assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); + } } \ No newline at end of file diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java deleted file mode 100644 index 109b361fe..000000000 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/FeedVolumeReductionTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package de.danoeh.antennapod.core.service.playback; - -import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class FeedVolumeReductionTest { - - @Test - public void noReductionIfTurnedOff() { - FeedPreferences feedPreferences = mock(FeedPreferences.class); - when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.OFF); - - FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); - float reductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); - assertEquals(1.0f, reductionFactor, 0.01f ); - } - - @Test - public void lightReductionYieldsHigherValueThanHeavyReduction() { - FeedPreferences feedPreferences = mock(FeedPreferences.class); - FeedVolumeReduction feedVolumeReduction = new FeedVolumeReduction(); - - when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.LIGHT); - float lightReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); - - when(feedPreferences.getVolumeReductionSetting()).thenReturn(VolumeReductionSetting.HEAVY); - float heavyReductionFactor = feedVolumeReduction.getReductionFactor(feedPreferences); - - assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); - } -} \ No newline at end of file -- cgit v1.2.3 From cc9c8bb63a27deb35f0e234d252e22a73ef6c117 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Thu, 17 Oct 2019 12:06:15 +0200 Subject: #3248 Extract @string resource for summary --- core/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 5b6e9eed6..2f3375fe0 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -90,6 +90,7 @@ The new Auto Download setting will automatically be applied to new episodes.\nDo you also want to apply it to previously published episodes? Auto Delete Episode Volume Reduction + Turn down volume for episodes of this feed: \%s Off Light Heavy -- cgit v1.2.3 From 12be60f1ba7ff88da9b3e5bc06f501892f3d7ba4 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sat, 21 Dec 2019 12:21:05 +0100 Subject: resolve review remarks w.r.t naming: volume reduction -> volume adaption --- .../java/de/danoeh/antennapod/core/feed/Feed.java | 2 +- .../antennapod/core/feed/FeedPreferences.java | 26 ++++----- .../core/feed/VolumeAdaptionSetting.java | 32 +++++++++++ .../core/feed/VolumeReductionSetting.java | 32 ----------- .../core/service/download/DownloadService.java | 1 - .../service/download/handler/FeedParserTask.java | 4 +- .../core/service/playback/LocalPSMP.java | 10 ++-- .../core/service/playback/PlaybackService.java | 28 +++++----- .../service/playback/PlaybackVolumeUpdater.java | 10 ++-- .../danoeh/antennapod/core/storage/DBUpgrader.java | 2 +- .../antennapod/core/storage/PodDBAdapter.java | 9 ++- .../core/feed/VolumeAdaptionSettingTest.java | 64 ++++++++++++++++++++++ .../core/feed/VolumeReductionSettingTest.java | 64 ---------------------- .../playback/PlaybackVolumeUpdaterTest.java | 36 ++++++------ 14 files changed, 158 insertions(+), 162 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSetting.java delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java create mode 100644 core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java delete mode 100644 core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java index 58a21760b..b1598f111 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java @@ -171,7 +171,7 @@ public class Feed extends FeedFile implements ImageResource { */ public Feed(String url, String lastUpdate, String title, String username, String password) { this(url, lastUpdate, title); - preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, VolumeReductionSetting.OFF, username, password); + preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, VolumeAdaptionSetting.OFF, username, password); } public static Feed fromCursor(Cursor cursor) { 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 cb5a59a3b..b24c52266 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 @@ -29,22 +29,22 @@ public class FeedPreferences { } private AutoDeleteAction auto_delete_action; - private VolumeReductionSetting volumeReductionSetting; + private VolumeAdaptionSetting volumeAdaptionSetting; private String username; private String password; private float feedPlaybackSpeed; - public FeedPreferences(long feedID, boolean autoDownload, AutoDeleteAction auto_delete_action, VolumeReductionSetting volumeReductionSetting, String username, String password) { - this(feedID, autoDownload, true, auto_delete_action, volumeReductionSetting, username, password, new FeedFilter(), SPEED_USE_GLOBAL); + public FeedPreferences(long feedID, boolean autoDownload, AutoDeleteAction auto_delete_action, VolumeAdaptionSetting volumeAdaptionSetting, String username, String password) { + this(feedID, autoDownload, true, auto_delete_action, volumeAdaptionSetting, username, password, new FeedFilter(), SPEED_USE_GLOBAL); } - private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, VolumeReductionSetting volumeReductionSetting, String username, String password, @NonNull FeedFilter filter, float feedPlaybackSpeed) { + private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, VolumeAdaptionSetting volumeAdaptionSetting, String username, String password, @NonNull FeedFilter filter, float feedPlaybackSpeed) { this.feedID = feedID; this.autoDownload = autoDownload; this.keepUpdated = keepUpdated; this.auto_delete_action = auto_delete_action; - this.volumeReductionSetting = volumeReductionSetting; + this.volumeAdaptionSetting = volumeAdaptionSetting; this.username = username; this.password = password; this.filter = filter; @@ -56,7 +56,7 @@ public class FeedPreferences { int indexAutoDownload = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DOWNLOAD); int indexAutoRefresh = cursor.getColumnIndex(PodDBAdapter.KEY_KEEP_UPDATED); int indexAutoDeleteAction = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DELETE_ACTION); - int indexVolumeReduction = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_VOLUME_REDUCTION); + int indexVolumeAdaption = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_VOLUME_ADAPTION); int indexUsername = cursor.getColumnIndex(PodDBAdapter.KEY_USERNAME); int indexPassword = cursor.getColumnIndex(PodDBAdapter.KEY_PASSWORD); int indexIncludeFilter = cursor.getColumnIndex(PodDBAdapter.KEY_INCLUDE_FILTER); @@ -68,14 +68,14 @@ public class FeedPreferences { boolean autoRefresh = cursor.getInt(indexAutoRefresh) > 0; int autoDeleteActionIndex = cursor.getInt(indexAutoDeleteAction); AutoDeleteAction autoDeleteAction = AutoDeleteAction.values()[autoDeleteActionIndex]; - int volumeReductionValue = cursor.getInt(indexVolumeReduction); - VolumeReductionSetting volumeReductionSetting = VolumeReductionSetting.fromInteger(volumeReductionValue); + int volumeAdaptionValue = cursor.getInt(indexVolumeAdaption); + VolumeAdaptionSetting volumeAdaptionSetting = VolumeAdaptionSetting.fromInteger(volumeAdaptionValue); String username = cursor.getString(indexUsername); String password = cursor.getString(indexPassword); String includeFilter = cursor.getString(indexIncludeFilter); String excludeFilter = cursor.getString(indexExcludeFilter); float feedPlaybackSpeed = cursor.getFloat(indexFeedPlaybackSpeed); - return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, volumeReductionSetting, username, password, new FeedFilter(includeFilter, excludeFilter), feedPlaybackSpeed); + return new FeedPreferences(feedId, autoDownload, autoRefresh, autoDeleteAction, volumeAdaptionSetting, username, password, new FeedFilter(includeFilter, excludeFilter), feedPlaybackSpeed); } /** @@ -151,16 +151,16 @@ public class FeedPreferences { return auto_delete_action; } - public VolumeReductionSetting getVolumeReductionSetting() { - return volumeReductionSetting; + public VolumeAdaptionSetting getVolumeAdaptionSetting() { + return volumeAdaptionSetting; } public void setAutoDeleteAction(AutoDeleteAction auto_delete_action) { this.auto_delete_action = auto_delete_action; } - public void setVolumeReductionSetting(VolumeReductionSetting volumeReductionSetting) { - this.volumeReductionSetting = volumeReductionSetting; + public void setVolumeAdaptionSetting(VolumeAdaptionSetting volumeAdaptionSetting) { + this.volumeAdaptionSetting = volumeAdaptionSetting; } public boolean getCurrentAutoDelete() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSetting.java b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSetting.java new file mode 100644 index 000000000..bf4fc582a --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSetting.java @@ -0,0 +1,32 @@ +package de.danoeh.antennapod.core.feed; + +public enum VolumeAdaptionSetting { + OFF(0, 1.0f), + LIGHT_REDUCTION(1, 0.5f), + HEAVY_REDUCTION(2, 0.2f); + + private final int value; + private float adaptionFactor; + + VolumeAdaptionSetting(int value, float adaptionFactor) { + this.value = value; + this.adaptionFactor = adaptionFactor; + } + + public static VolumeAdaptionSetting fromInteger(int value) { + for (VolumeAdaptionSetting setting : values()) { + if (setting.value == value) { + return setting; + } + } + throw new IllegalArgumentException("Cannot map value to VolumeAdaptionSetting: " + value); + } + + public int toInteger() { + return value; + } + + public float getAdaptionFactor() { + return adaptionFactor; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java b/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java deleted file mode 100644 index 53808580a..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/VolumeReductionSetting.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.danoeh.antennapod.core.feed; - -public enum VolumeReductionSetting { - OFF(0, 1.0f), - LIGHT(1, 0.5f), - HEAVY(2, 0.2f); - - private final int value; - private float reductionFactor; - - VolumeReductionSetting(int value, float reductionFactor) { - this.value = value; - this.reductionFactor = reductionFactor; - } - - public static VolumeReductionSetting fromInteger(int value) { - for (VolumeReductionSetting setting : values()) { - if (setting.value == value) { - return setting; - } - } - throw new IllegalArgumentException("Cannot map value to VolumeReductionSetting: " + value); - } - - public int toInteger() { - return value; - } - - public float getReductionFactor() { - return reductionFactor; - } -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 72e080902..7c05293c6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -17,7 +17,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import org.apache.commons.io.FileUtils; import org.greenrobot.eventbus.EventBus; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java index a7cbb4cfe..5900f84fc 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java @@ -4,7 +4,7 @@ import android.util.Log; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DownloadRequester; @@ -38,7 +38,7 @@ public class FeedParserTask implements Callable { feed.setId(request.getFeedfileId()); feed.setDownloaded(true); feed.setPreferences(new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, - VolumeReductionSetting.OFF, request.getUsername(), request.getPassword())); + VolumeAdaptionSetting.OFF, request.getUsername(), request.getPassword())); feed.setPageNr(request.getArguments().getInt(DownloadRequester.REQUEST_ARG_PAGE_NR, 0)); DownloadError reason = 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 ead686ae4..8965f5fbf 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 @@ -29,8 +29,8 @@ import java.util.concurrent.locks.ReentrantLock; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedPreferences; import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.RewindAfterPauseUtils; import de.danoeh.antennapod.core.util.playback.AudioPlayer; @@ -673,10 +673,10 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (playable instanceof FeedMedia) { FeedMedia feedMedia = (FeedMedia) playable; FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - VolumeReductionSetting volumeReductionSetting = preferences.getVolumeReductionSetting(); - float reductionFactor = volumeReductionSetting.getReductionFactor(); - volumeLeft *= reductionFactor; - volumeRight *= reductionFactor; + VolumeAdaptionSetting volumeAdaptionSetting = preferences.getVolumeAdaptionSetting(); + float adaptionFactor = volumeAdaptionSetting.getAdaptionFactor(); + volumeLeft *= adaptionFactor; + volumeRight *= adaptionFactor; } mediaPlayer.setVolume(volumeLeft, volumeRight); Log.d(TAG, "Media player volume was set to " + volumeLeft + " " + volumeRight); 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 8f9aff8f8..8673d2744 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 @@ -1,6 +1,5 @@ package de.danoeh.antennapod.core.service.playback; -import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -58,7 +57,7 @@ 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.feed.SearchResult; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; @@ -72,7 +71,6 @@ import de.danoeh.antennapod.core.storage.FeedSearcher; import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.NetworkUtils; -import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.gui.NotificationUtils; import de.danoeh.antennapod.core.util.playback.ExternalMedia; import de.danoeh.antennapod.core.util.playback.Playable; @@ -139,11 +137,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { public static final String ACTION_PAUSE_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.pausePlayCurrentEpisode"; /** - * If the PlaybackService receives this action, it will try to apply the supplied volume reduction setting. + * If the PlaybackService receives this action, it will try to apply the supplied volume adaption setting. */ - public static final String ACTION_VOLUME_REDUCTION_CHANGED = "action.de.danoeh.antennapod.core.service.volumedReductionChanged"; - public static final String EXTRA_VOLUME_REDUCTION_SETTING = "PlaybackService.VolumeReductionSettingExtra"; - public static final String EXTRA_VOLUME_REDUCTION_AFFECTED_FEED = "PlaybackService.VolumeReductionSettingAffectedFeed"; + public static final String ACTION_VOLUME_ADAPTION_CHANGED = "action.de.danoeh.antennapod.core.service.volumedAdaptionChanged"; + public static final String EXTRA_VOLUME_ADAPTION_SETTING = "PlaybackService.VolumeAdaptionSettingExtra"; + public static final String EXTRA_VOLUME_ADAPTION_AFFECTED_FEED = "PlaybackService.VolumeAdaptionSettingAffectedFeed"; /** * Custom action used by Android Wear @@ -286,7 +284,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { registerReceiver(audioBecomingNoisy, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter(ACTION_SKIP_CURRENT_EPISODE)); registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter(ACTION_PAUSE_PLAY_CURRENT_EPISODE)); - registerReceiver(volumeReductionChangedReceiver, new IntentFilter(ACTION_VOLUME_REDUCTION_CHANGED)); + registerReceiver(volumeAdaptionChangedReceiver, new IntentFilter(ACTION_VOLUME_ADAPTION_CHANGED)); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); flavorHelper = new PlaybackServiceFlavorHelper(PlaybackService.this, flavorHelperCallback); @@ -1446,18 +1444,18 @@ public class PlaybackService extends MediaBrowserServiceCompat { } }; - private final BroadcastReceiver volumeReductionChangedReceiver = new BroadcastReceiver() { + private final BroadcastReceiver volumeAdaptionChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (TextUtils.equals(intent.getAction(), ACTION_VOLUME_REDUCTION_CHANGED)) { - Log.d(TAG, "Received ACTION_VOLUME_REDUCTION_CHANGED intent"); + if (TextUtils.equals(intent.getAction(), ACTION_VOLUME_ADAPTION_CHANGED)) { + Log.d(TAG, "Received ACTION_VOLUME_ADAPTION_CHANGED intent"); - String affectedFeed = intent.getStringExtra(EXTRA_VOLUME_REDUCTION_AFFECTED_FEED); - Serializable volumeReductionExtra = intent.getSerializableExtra(EXTRA_VOLUME_REDUCTION_SETTING); - VolumeReductionSetting volumeReductionSetting = (VolumeReductionSetting) volumeReductionExtra; + String affectedFeed = intent.getStringExtra(EXTRA_VOLUME_ADAPTION_AFFECTED_FEED); + Serializable volumeAdaptionExtra = intent.getSerializableExtra(EXTRA_VOLUME_ADAPTION_SETTING); + VolumeAdaptionSetting volumeAdaptionSetting = (VolumeAdaptionSetting) volumeAdaptionExtra; PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, affectedFeed, volumeReductionSetting); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, affectedFeed, volumeAdaptionSetting); } } }; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java index aff742105..9e8f34de5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java @@ -2,25 +2,25 @@ package de.danoeh.antennapod.core.service.playback; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.util.playback.Playable; class PlaybackVolumeUpdater { - public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting) { + public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeAdaptionSetting volumeAdaptionSetting) { Playable playable = mediaPlayer.getPlayable(); boolean isFeedMedia = playable instanceof FeedMedia; boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); if (isFeedMedia && isPlayableLoaded) { - updateFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeReductionSetting, (FeedMedia) playable); + updateFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeAdaptionSetting, (FeedMedia) playable); } } - private void updateFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeReductionSetting volumeReductionSetting, FeedMedia feedMedia) { + private void updateFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeAdaptionSetting volumeAdaptionSetting, FeedMedia feedMedia) { if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - preferences.setVolumeReductionSetting(volumeReductionSetting); + preferences.setVolumeAdaptionSetting(volumeAdaptionSetting); if (mediaPlayer.getPlayerStatus() == PlayerStatus.PLAYING) { forceUpdateVolume(mediaPlayer); 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 aa1395d9c..bae8f2e7c 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 @@ -300,7 +300,7 @@ class DBUpgrader { + " ADD COLUMN " + PodDBAdapter.KEY_SORT_ORDER + " TEXT"); db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS - + " ADD COLUMN " + PodDBAdapter.KEY_FEED_VOLUME_REDUCTION + " INTEGER DEFAULT 0"); + + " ADD COLUMN " + PodDBAdapter.KEY_FEED_VOLUME_ADAPTION + " INTEGER DEFAULT 0"); } } 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 d9f4e319a..a91d9a3a0 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,7 +12,6 @@ import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; -import android.os.Build; import android.text.TextUtils; import android.util.Log; @@ -97,7 +96,7 @@ public class PodDBAdapter { public static final String KEY_AUTO_DOWNLOAD = "auto_download"; public static final String KEY_KEEP_UPDATED = "keep_updated"; public static final String KEY_AUTO_DELETE_ACTION = "auto_delete_action"; - public static final String KEY_FEED_VOLUME_REDUCTION = "feed_volume_reduction"; + public static final String KEY_FEED_VOLUME_ADAPTION = "feed_volume_adaption"; public static final String KEY_PLAYED_DURATION = "played_duration"; public static final String KEY_USERNAME = "username"; public static final String KEY_PASSWORD = "password"; @@ -146,7 +145,7 @@ public class PodDBAdapter { + KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0," + KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0," + KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + "," - + KEY_FEED_VOLUME_REDUCTION + " INTEGER DEFAULT 0)"; + + KEY_FEED_VOLUME_ADAPTION + " INTEGER DEFAULT 0)"; private static final String CREATE_TABLE_FEED_ITEMS = "CREATE TABLE " + TABLE_NAME_FEED_ITEMS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE @@ -243,7 +242,7 @@ public class PodDBAdapter { TABLE_NAME_FEEDS + "." + KEY_SORT_ORDER, TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED, TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION, - TABLE_NAME_FEEDS + "." + KEY_FEED_VOLUME_REDUCTION, + TABLE_NAME_FEEDS + "." + KEY_FEED_VOLUME_ADAPTION, TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER, TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER, TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED @@ -406,7 +405,7 @@ public class PodDBAdapter { values.put(KEY_AUTO_DOWNLOAD, prefs.getAutoDownload()); values.put(KEY_KEEP_UPDATED, prefs.getKeepUpdated()); values.put(KEY_AUTO_DELETE_ACTION, prefs.getAutoDeleteAction().ordinal()); - values.put(KEY_FEED_VOLUME_REDUCTION, prefs.getVolumeReductionSetting().toInteger()); + values.put(KEY_FEED_VOLUME_ADAPTION, prefs.getVolumeAdaptionSetting().toInteger()); values.put(KEY_USERNAME, prefs.getUsername()); values.put(KEY_PASSWORD, prefs.getPassword()); values.put(KEY_INCLUDE_FILTER, prefs.getFilter().getIncludeFilter()); diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java new file mode 100644 index 000000000..45c86cb83 --- /dev/null +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java @@ -0,0 +1,64 @@ +package de.danoeh.antennapod.core.feed; + +import org.junit.Test; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class VolumeAdaptionSettingTest { + + @Test + public void mapOffToInteger() { + VolumeAdaptionSetting setting = VolumeAdaptionSetting.OFF; + assertThat(setting.toInteger(), is(equalTo(0))); + } + + @Test + public void mapLightReductionToInteger() { + VolumeAdaptionSetting setting = VolumeAdaptionSetting.LIGHT_REDUCTION; + + assertThat(setting.toInteger(), is(equalTo(1))); + } + + @Test + public void mapHeavyReductionToInteger() { + VolumeAdaptionSetting setting = VolumeAdaptionSetting.HEAVY_REDUCTION; + + assertThat(setting.toInteger(), is(equalTo(2))); + } + + @Test + public void mapIntegerToVolumeAdaptionSetting() { + assertThat(VolumeAdaptionSetting.fromInteger(0), is(equalTo(VolumeAdaptionSetting.OFF))); + assertThat(VolumeAdaptionSetting.fromInteger(1), is(equalTo(VolumeAdaptionSetting.LIGHT_REDUCTION))); + assertThat(VolumeAdaptionSetting.fromInteger(2), is(equalTo(VolumeAdaptionSetting.HEAVY_REDUCTION))); + } + + @Test(expected = IllegalArgumentException.class) + public void cannotMapNegativeValues() { + VolumeAdaptionSetting.fromInteger(-1); + } + + @Test(expected = IllegalArgumentException.class) + public void cannotMapValuesOutOfRange() { + VolumeAdaptionSetting.fromInteger(3); + } + + @Test + public void noAdaptionIfTurnedOff() { + float adaptionFactor = VolumeAdaptionSetting.OFF.getAdaptionFactor(); + assertEquals(1.0f, adaptionFactor, 0.01f); + } + + @Test + public void lightReductionYieldsHigherValueThanHeavyReduction() { + float lightReductionFactor = VolumeAdaptionSetting.LIGHT_REDUCTION.getAdaptionFactor(); + + float heavyReductionFactor = VolumeAdaptionSetting.HEAVY_REDUCTION.getAdaptionFactor(); + + assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); + } +} \ No newline at end of file diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java deleted file mode 100644 index a97fb6f20..000000000 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeReductionSettingTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package de.danoeh.antennapod.core.feed; - -import org.junit.Test; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - -public class VolumeReductionSettingTest { - - @Test - public void mapOffToInteger() { - VolumeReductionSetting setting = VolumeReductionSetting.OFF; - assertThat(setting.toInteger(), is(equalTo(0))); - } - - @Test - public void mapLightToInteger() { - VolumeReductionSetting setting = VolumeReductionSetting.LIGHT; - - assertThat(setting.toInteger(), is(equalTo(1))); - } - - @Test - public void mapHeavyToInteger() { - VolumeReductionSetting setting = VolumeReductionSetting.HEAVY; - - assertThat(setting.toInteger(), is(equalTo(2))); - } - - @Test - public void mapIntegerToVolumeReductionSetting() { - assertThat(VolumeReductionSetting.fromInteger(0), is(equalTo(VolumeReductionSetting.OFF))); - assertThat(VolumeReductionSetting.fromInteger(1), is(equalTo(VolumeReductionSetting.LIGHT))); - assertThat(VolumeReductionSetting.fromInteger(2), is(equalTo(VolumeReductionSetting.HEAVY))); - } - - @Test(expected = IllegalArgumentException.class) - public void cannotMapNegativeValues() { - VolumeReductionSetting.fromInteger(-1); - } - - @Test(expected = IllegalArgumentException.class) - public void cannotMapValuesOutOfRange() { - VolumeReductionSetting.fromInteger(3); - } - - @Test - public void noReductionIfTurnedOff() { - float reductionFactor = VolumeReductionSetting.OFF.getReductionFactor(); - assertEquals(1.0f, reductionFactor, 0.01f); - } - - @Test - public void lightReductionYieldsHigherValueThanHeavyReduction() { - float lightReductionFactor = VolumeReductionSetting.LIGHT.getReductionFactor(); - - float heavyReductionFactor = VolumeReductionSetting.HEAVY.getReductionFactor(); - - assertTrue("Light reduction must have higher factor than heavy reduction", lightReductionFactor > heavyReductionFactor); - } -} \ No newline at end of file diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java index 4ebe4e5ba..02c3b6efb 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java @@ -4,7 +4,7 @@ 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.FeedPreferences; -import de.danoeh.antennapod.core.feed.VolumeReductionSetting; +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.util.playback.Playable; import org.junit.Before; import org.junit.Test; @@ -36,7 +36,7 @@ public class PlaybackVolumeUpdaterTest { Playable noFeedMedia = mock(Playable.class); when(mediaPlayer.getPlayable()).thenReturn(noFeedMedia); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -51,7 +51,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -66,7 +66,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -81,7 +81,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -98,7 +98,7 @@ public class PlaybackVolumeUpdaterTest { Feed feed = mockFeed(feedMedia, FEED_ID); when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.OFF); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -114,9 +114,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.LIGHT_REDUCTION); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -132,9 +132,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.LIGHT_REDUCTION); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -150,9 +150,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.LIGHT_REDUCTION); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -168,9 +168,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.LIGHT_REDUCTION); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -186,9 +186,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.LIGHT); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.LIGHT); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.LIGHT_REDUCTION); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); verify(mediaPlayer, never()).resume(); @@ -204,9 +204,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayable()).thenReturn(feedMedia); FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeReductionSetting.HEAVY); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.HEAVY_REDUCTION); - verify(feedPreferences, times(1)).setVolumeReductionSetting(VolumeReductionSetting.HEAVY); + verify(feedPreferences, times(1)).setVolumeAdaptionSetting(VolumeAdaptionSetting.HEAVY_REDUCTION); verify(mediaPlayer, times(1)).pause(false, false); verify(mediaPlayer, times(1)).resume(); -- cgit v1.2.3 From 95fd348c113c1661b1035b172c319827e1cba364 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sun, 29 Dec 2019 11:21:30 +0100 Subject: unregister volume adaption receiver --- .../java/de/danoeh/antennapod/core/service/playback/PlaybackService.java | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') 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 8673d2744..577e482ec 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 @@ -356,6 +356,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { unregisterReceiver(audioBecomingNoisy); unregisterReceiver(skipCurrentEpisodeReceiver); unregisterReceiver(pausePlayCurrentEpisodeReceiver); + unregisterReceiver(volumeAdaptionChangedReceiver); flavorHelper.removeCastConsumer(); flavorHelper.unregisterWifiBroadcastReceiver(); mediaPlayer.shutdown(); -- cgit v1.2.3 From 3e610c85b9e113263a2c37a49aeb5a9db1e912e5 Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Sun, 29 Dec 2019 11:42:45 +0100 Subject: provide drawable for volume adaption setting --- core/src/main/res/drawable/ic_volume_adaption_grey.xml | 9 +++++++++ core/src/main/res/drawable/ic_volume_adaption_white.xml | 9 +++++++++ core/src/main/res/values/attrs.xml | 1 + core/src/main/res/values/styles.xml | 2 ++ 4 files changed, 21 insertions(+) create mode 100644 core/src/main/res/drawable/ic_volume_adaption_grey.xml create mode 100644 core/src/main/res/drawable/ic_volume_adaption_white.xml (limited to 'core/src') diff --git a/core/src/main/res/drawable/ic_volume_adaption_grey.xml b/core/src/main/res/drawable/ic_volume_adaption_grey.xml new file mode 100644 index 000000000..fe39e1c70 --- /dev/null +++ b/core/src/main/res/drawable/ic_volume_adaption_grey.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/core/src/main/res/drawable/ic_volume_adaption_white.xml b/core/src/main/res/drawable/ic_volume_adaption_white.xml new file mode 100644 index 000000000..27d7c6e7b --- /dev/null +++ b/core/src/main/res/drawable/ic_volume_adaption_white.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index fe571539a..c6668675f 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -53,6 +53,7 @@ + diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index a638917f4..6a82adf74 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -76,6 +76,7 @@ @drawable/ic_bookmark_grey600_24dp @drawable/ic_fab_edit_white @drawable/ic_key_grey600 + @drawable/ic_volume_adaption_grey @color/master_switch_background_light @color/highlight_light @@ -164,6 +165,7 @@ @drawable/ic_bookmark_white_24dp @drawable/ic_fab_edit_white @drawable/ic_key_white + @drawable/ic_volume_adaption_white @color/master_switch_background_dark @color/highlight_dark @style/PreferenceThemeOverlay.v14.Material -- cgit v1.2.3 From 3fa210c41408180b19064c7d98928cb457fb21ef Mon Sep 17 00:00:00 2001 From: Max Bechtold Date: Mon, 30 Dec 2019 12:39:59 +0100 Subject: remove check of media type --- .../core/service/playback/LocalPSMP.java | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'core/src') 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 8965f5fbf..9c32e42e0 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 @@ -668,19 +668,17 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { */ private void setVolumeSync(float volumeLeft, float volumeRight) { playerLock.lock(); - if (media != null && EnumSet.of(MediaType.AUDIO, MediaType.VIDEO).contains(media.getMediaType())) { - Playable playable = getPlayable(); - if (playable instanceof FeedMedia) { - FeedMedia feedMedia = (FeedMedia) playable; - FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); - VolumeAdaptionSetting volumeAdaptionSetting = preferences.getVolumeAdaptionSetting(); - float adaptionFactor = volumeAdaptionSetting.getAdaptionFactor(); - volumeLeft *= adaptionFactor; - volumeRight *= adaptionFactor; - } - mediaPlayer.setVolume(volumeLeft, volumeRight); - Log.d(TAG, "Media player volume was set to " + volumeLeft + " " + volumeRight); + Playable playable = getPlayable(); + if (playable instanceof FeedMedia) { + FeedMedia feedMedia = (FeedMedia) playable; + FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); + VolumeAdaptionSetting volumeAdaptionSetting = preferences.getVolumeAdaptionSetting(); + float adaptionFactor = volumeAdaptionSetting.getAdaptionFactor(); + volumeLeft *= adaptionFactor; + volumeRight *= adaptionFactor; } + mediaPlayer.setVolume(volumeLeft, volumeRight); + Log.d(TAG, "Media player volume was set to " + volumeLeft + " " + volumeRight); playerLock.unlock(); } -- cgit v1.2.3 From e2ec07f607ff05e900ac2dd524945ba8f9ff775c Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 25 Jan 2020 22:35:18 +0100 Subject: Database upgrade --- .../main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java | 4 ++-- .../main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) (limited to 'core/src') 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 bae8f2e7c..234ce8367 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,11 +294,11 @@ class DBUpgrader { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL); } - if (oldVersion < 1070401) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_SORT_ORDER + " TEXT"); - + } + if (oldVersion < 1090000) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_FEED_VOLUME_ADAPTION + " INTEGER DEFAULT 0"); } 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 a91d9a3a0..6f1f3e65d 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 @@ -1467,10 +1467,7 @@ public class PodDBAdapter { * Helper class for opening the Antennapod database. */ private static class PodDBHelper extends SQLiteOpenHelper { - - private static final int VERSION = 1070401; - - private final Context context; + private static final int VERSION = 1090000; /** * Constructor. @@ -1482,7 +1479,6 @@ public class PodDBAdapter { public PodDBHelper(final Context context, final String name, final CursorFactory factory) { super(context, name, factory, VERSION, new PodDbErrorHandler()); - this.context = context; } @Override @@ -1501,7 +1497,6 @@ public class PodDBAdapter { db.execSQL(CREATE_INDEX_FEEDMEDIA_FEEDITEM); db.execSQL(CREATE_INDEX_QUEUE_FEEDITEM); db.execSQL(CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM); - } @Override -- cgit v1.2.3 From 190b54ad70ccf25f869eb92b9699f0d90552974f Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 25 Jan 2020 22:52:00 +0100 Subject: Converted to EventBus instead of broadcast --- .../event/settings/VolumeAdaptionChangedEvent.java | 21 +++++++++++++ .../core/service/playback/PlaybackService.java | 34 +++++----------------- .../service/playback/PlaybackVolumeUpdater.java | 15 ++++------ .../playback/PlaybackVolumeUpdaterTest.java | 29 +++++++++--------- 4 files changed, 49 insertions(+), 50 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/event/settings/VolumeAdaptionChangedEvent.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/settings/VolumeAdaptionChangedEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/settings/VolumeAdaptionChangedEvent.java new file mode 100644 index 000000000..3ed84f6a8 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/event/settings/VolumeAdaptionChangedEvent.java @@ -0,0 +1,21 @@ +package de.danoeh.antennapod.core.event.settings; + +import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; + +public class VolumeAdaptionChangedEvent { + private final VolumeAdaptionSetting volumeAdaptionSetting; + private final long feedId; + + public VolumeAdaptionChangedEvent(VolumeAdaptionSetting volumeAdaptionSetting, long feedId) { + this.volumeAdaptionSetting = volumeAdaptionSetting; + this.feedId = feedId; + } + + public VolumeAdaptionSetting getVolumeAdaptionSetting() { + return volumeAdaptionSetting; + } + + public long getFeedId() { + return feedId; + } +} 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 577e482ec..2fb37cc05 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 @@ -41,7 +41,6 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; -import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -51,13 +50,13 @@ import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.event.MessageEvent; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; import de.danoeh.antennapod.core.event.ServiceEvent; +import de.danoeh.antennapod.core.event.settings.VolumeAdaptionChangedEvent; import de.danoeh.antennapod.core.feed.Chapter; 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.feed.SearchResult; -import de.danoeh.antennapod.core.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; @@ -79,6 +78,7 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; /** * Controls the MediaPlayer that plays a FeedMedia-file @@ -136,13 +136,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ public static final String ACTION_PAUSE_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.pausePlayCurrentEpisode"; - /** - * If the PlaybackService receives this action, it will try to apply the supplied volume adaption setting. - */ - public static final String ACTION_VOLUME_ADAPTION_CHANGED = "action.de.danoeh.antennapod.core.service.volumedAdaptionChanged"; - public static final String EXTRA_VOLUME_ADAPTION_SETTING = "PlaybackService.VolumeAdaptionSettingExtra"; - public static final String EXTRA_VOLUME_ADAPTION_AFFECTED_FEED = "PlaybackService.VolumeAdaptionSettingAffectedFeed"; - /** * Custom action used by Android Wear */ @@ -284,7 +277,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { registerReceiver(audioBecomingNoisy, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter(ACTION_SKIP_CURRENT_EPISODE)); registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter(ACTION_PAUSE_PLAY_CURRENT_EPISODE)); - registerReceiver(volumeAdaptionChangedReceiver, new IntentFilter(ACTION_VOLUME_ADAPTION_CHANGED)); + EventBus.getDefault().register(this); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); flavorHelper = new PlaybackServiceFlavorHelper(PlaybackService.this, flavorHelperCallback); @@ -356,7 +349,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { unregisterReceiver(audioBecomingNoisy); unregisterReceiver(skipCurrentEpisodeReceiver); unregisterReceiver(pausePlayCurrentEpisodeReceiver); - unregisterReceiver(volumeAdaptionChangedReceiver); flavorHelper.removeCastConsumer(); flavorHelper.unregisterWifiBroadcastReceiver(); mediaPlayer.shutdown(); @@ -1445,21 +1437,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { } }; - private final BroadcastReceiver volumeAdaptionChangedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (TextUtils.equals(intent.getAction(), ACTION_VOLUME_ADAPTION_CHANGED)) { - Log.d(TAG, "Received ACTION_VOLUME_ADAPTION_CHANGED intent"); - - String affectedFeed = intent.getStringExtra(EXTRA_VOLUME_ADAPTION_AFFECTED_FEED); - Serializable volumeAdaptionExtra = intent.getSerializableExtra(EXTRA_VOLUME_ADAPTION_SETTING); - VolumeAdaptionSetting volumeAdaptionSetting = (VolumeAdaptionSetting) volumeAdaptionExtra; - - PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); - playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, affectedFeed, volumeAdaptionSetting); - } - } - }; + @Subscribe + public void volumeAdaptionChanged(VolumeAdaptionChangedEvent event) { + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); + playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, event.getFeedId(), event.getVolumeAdaptionSetting()); + } public static MediaType getCurrentMediaType() { return currentMediaType; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java index 9e8f34de5..0ef7e55bc 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java @@ -7,18 +7,20 @@ import de.danoeh.antennapod.core.util.playback.Playable; class PlaybackVolumeUpdater { - public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeAdaptionSetting volumeAdaptionSetting) { + public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, long feedId, + VolumeAdaptionSetting volumeAdaptionSetting) { Playable playable = mediaPlayer.getPlayable(); boolean isFeedMedia = playable instanceof FeedMedia; boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); if (isFeedMedia && isPlayableLoaded) { - updateFeedMediaVolumeIfNecessary(mediaPlayer, affectedFeedIdentifier, volumeAdaptionSetting, (FeedMedia) playable); + updateFeedMediaVolumeIfNecessary(mediaPlayer, feedId, volumeAdaptionSetting, (FeedMedia) playable); } } - private void updateFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, String affectedFeedIdentifier, VolumeAdaptionSetting volumeAdaptionSetting, FeedMedia feedMedia) { - if (mediaBelongsToAffectedFeed(feedMedia, affectedFeedIdentifier)) { + private void updateFeedMediaVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, long feedId, + VolumeAdaptionSetting volumeAdaptionSetting, FeedMedia feedMedia) { + if (feedMedia.getItem().getFeed().getId() == feedId) { FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); preferences.setVolumeAdaptionSetting(volumeAdaptionSetting); @@ -37,11 +39,6 @@ class PlaybackVolumeUpdater { || playerStatus == PlayerStatus.INITIALIZING; } - private static boolean mediaBelongsToAffectedFeed(FeedMedia feedMedia, String affectedFeedIdentifier) { - return affectedFeedIdentifier != null - && affectedFeedIdentifier.equals(feedMedia.getItem().getFeed().getIdentifyingValue()); - } - private void forceUpdateVolume(PlaybackServiceMediaPlayer mediaPlayer) { mediaPlayer.pause(false, false); mediaPlayer.resume(); diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java index 02c3b6efb..a5a4ea760 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java @@ -18,12 +18,12 @@ import static org.mockito.Mockito.when; public class PlaybackVolumeUpdaterTest { - private static final String FEED_ID = "feedId"; + private static final long FEED_ID = 42; private PlaybackServiceMediaPlayer mediaPlayer; @Before - public void setUp() throws Exception { + public void setUp() { mediaPlayer = mock(PlaybackServiceMediaPlayer.class); } @@ -89,15 +89,14 @@ public class PlaybackVolumeUpdaterTest { @Test public void noChangeIfPlayableIsNoItemOfAffectedFeed() { - PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); - when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - Feed feed = mockFeed(feedMedia, FEED_ID); + Feed feed = mockFeed(feedMedia); when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); + PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); verify(mediaPlayer, never()).pause(anyBoolean(), anyBoolean()); @@ -112,7 +111,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -130,7 +129,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -148,7 +147,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -166,7 +165,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -184,7 +183,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -202,7 +201,7 @@ public class PlaybackVolumeUpdaterTest { FeedMedia feedMedia = mock(FeedMedia.class); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia, FEED_ID); + FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.HEAVY_REDUCTION); @@ -212,18 +211,18 @@ public class PlaybackVolumeUpdaterTest { verify(mediaPlayer, times(1)).resume(); } - private FeedPreferences mockFeedPreferences(FeedMedia feedMedia, String feedId) { - Feed feed = mockFeed(feedMedia, feedId); + private FeedPreferences mockFeedPreferences(FeedMedia feedMedia) { + Feed feed = mockFeed(feedMedia); FeedPreferences feedPreferences = mock(FeedPreferences.class); when(feed.getPreferences()).thenReturn(feedPreferences); return feedPreferences; } - private Feed mockFeed(FeedMedia feedMedia, String feedId) { + private Feed mockFeed(FeedMedia feedMedia) { FeedItem feedItem = mock(FeedItem.class); when(feedMedia.getItem()).thenReturn(feedItem); Feed feed = mock(Feed.class); - when(feed.getIdentifyingValue()).thenReturn(feedId); + when(feed.getId()).thenReturn(FEED_ID); when(feedItem.getFeed()).thenReturn(feed); return feed; } -- cgit v1.2.3 From e09fae22a26f79ce277ce4f2e708643ce2f103d3 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 25 Jan 2020 22:53:26 +0100 Subject: Fix volume adaption while paused --- .../core/service/playback/PlaybackVolumeUpdater.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java index 0ef7e55bc..d03830387 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdater.java @@ -10,10 +10,8 @@ class PlaybackVolumeUpdater { public void updateVolumeIfNecessary(PlaybackServiceMediaPlayer mediaPlayer, long feedId, VolumeAdaptionSetting volumeAdaptionSetting) { Playable playable = mediaPlayer.getPlayable(); - boolean isFeedMedia = playable instanceof FeedMedia; - boolean isPlayableLoaded = isPlayableLoaded(mediaPlayer.getPlayerStatus()); - if (isFeedMedia && isPlayableLoaded) { + if (playable instanceof FeedMedia) { updateFeedMediaVolumeIfNecessary(mediaPlayer, feedId, volumeAdaptionSetting, (FeedMedia) playable); } } @@ -30,15 +28,6 @@ class PlaybackVolumeUpdater { } } - private static boolean isPlayableLoaded(PlayerStatus playerStatus) { - return playerStatus == PlayerStatus.PLAYING - || playerStatus == PlayerStatus.PAUSED - || playerStatus == PlayerStatus.SEEKING - || playerStatus == PlayerStatus.PREPARING - || playerStatus == PlayerStatus.PREPARED - || playerStatus == PlayerStatus.INITIALIZING; - } - private void forceUpdateVolume(PlaybackServiceMediaPlayer mediaPlayer) { mediaPlayer.pause(false, false); mediaPlayer.resume(); -- cgit v1.2.3 From 964a519b8ccfc2f4c8835a15018d81407768e11f Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 25 Jan 2020 23:18:31 +0100 Subject: Always mock full feedMedia --- .../playback/PlaybackVolumeUpdaterTest.java | 54 ++++++++++------------ 1 file changed, 25 insertions(+), 29 deletions(-) (limited to 'core/src') diff --git a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java index a5a4ea760..22f67933f 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/service/playback/PlaybackVolumeUpdaterTest.java @@ -48,7 +48,7 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.ERROR); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); @@ -63,7 +63,7 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INDETERMINATE); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); @@ -78,7 +78,7 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.STOPPED); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); @@ -91,10 +91,9 @@ public class PlaybackVolumeUpdaterTest { public void noChangeIfPlayableIsNoItemOfAffectedFeed() { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - Feed feed = mockFeed(feedMedia); - when(feed.getIdentifyingValue()).thenReturn("wrongFeedId"); + when(feedMedia.getItem().getFeed().getId()).thenReturn(FEED_ID + 1); PlaybackVolumeUpdater playbackVolumeUpdater = new PlaybackVolumeUpdater(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.OFF); @@ -109,9 +108,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PAUSED); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -127,9 +126,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARED); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -145,9 +144,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.INITIALIZING); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -163,9 +162,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PREPARING); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -181,9 +180,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.SEEKING); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.LIGHT_REDUCTION); @@ -199,9 +198,9 @@ public class PlaybackVolumeUpdaterTest { when(mediaPlayer.getPlayerStatus()).thenReturn(PlayerStatus.PLAYING); - FeedMedia feedMedia = mock(FeedMedia.class); + FeedMedia feedMedia = mockFeedMedia(); when(mediaPlayer.getPlayable()).thenReturn(feedMedia); - FeedPreferences feedPreferences = mockFeedPreferences(feedMedia); + FeedPreferences feedPreferences = feedMedia.getItem().getFeed().getPreferences(); playbackVolumeUpdater.updateVolumeIfNecessary(mediaPlayer, FEED_ID, VolumeAdaptionSetting.HEAVY_REDUCTION); @@ -210,20 +209,17 @@ public class PlaybackVolumeUpdaterTest { verify(mediaPlayer, times(1)).pause(false, false); verify(mediaPlayer, times(1)).resume(); } - - private FeedPreferences mockFeedPreferences(FeedMedia feedMedia) { - Feed feed = mockFeed(feedMedia); + + private FeedMedia mockFeedMedia() { + FeedMedia feedMedia = mock(FeedMedia.class); + FeedItem feedItem = mock(FeedItem.class); + Feed feed = mock(Feed.class); FeedPreferences feedPreferences = mock(FeedPreferences.class); - when(feed.getPreferences()).thenReturn(feedPreferences); - return feedPreferences; - } - private Feed mockFeed(FeedMedia feedMedia) { - FeedItem feedItem = mock(FeedItem.class); when(feedMedia.getItem()).thenReturn(feedItem); - Feed feed = mock(Feed.class); - when(feed.getId()).thenReturn(FEED_ID); when(feedItem.getFeed()).thenReturn(feed); - return feed; + when(feed.getId()).thenReturn(FEED_ID); + when(feed.getPreferences()).thenReturn(feedPreferences); + return feedMedia; } } -- cgit v1.2.3