Decouple restoring Playable from Preferences and storing position

Breaks dependency cycle
This commit is contained in:
ByteHamster 2022-11-03 23:04:45 +01:00
parent cd9845ed4c
commit 5b8cee0de0
7 changed files with 56 additions and 75 deletions

View File

@ -2,9 +2,12 @@ package de.danoeh.antennapod.core.preferences;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.event.PlayerStatusEvent;
import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.model.playback.MediaType;
@ -187,4 +190,48 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference
} }
return playerStatusAsInt; return playerStatusAsInt;
} }
/**
* Restores a playable object from a sharedPreferences file. This method might load data from the database,
* depending on the type of playable that was restored.
*
* @return The restored Playable object
*/
@Nullable
public static Playable createInstanceFromPreferences(@NonNull Context context) {
long currentlyPlayingMedia = PlaybackPreferences.getCurrentlyPlayingMediaType();
if (currentlyPlayingMedia != PlaybackPreferences.NO_MEDIA_PLAYING) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
return createInstanceFromPreferences((int) currentlyPlayingMedia, prefs);
}
return null;
}
/**
* Restores a playable object from a sharedPreferences file. This method might load data from the database,
* depending on the type of playable that was restored.
*
* @param type An integer that represents the type of the Playable object
* that is restored.
* @param pref The SharedPreferences file from which the Playable object
* is restored
* @return The restored Playable object
*/
private static Playable createInstanceFromPreferences(int type, SharedPreferences pref) {
if (type == FeedMedia.PLAYABLE_TYPE_FEEDMEDIA) {
return createFeedMediaInstance(pref);
} else {
Log.e(TAG, "Could not restore Playable object from preferences");
return null;
}
}
private static Playable createFeedMediaInstance(SharedPreferences pref) {
Playable result = null;
long mediaId = pref.getLong(FeedMedia.PREF_MEDIA_ID, -1);
if (mediaId != -1) {
result = DBReader.getFeedMedia(mediaId);
}
return result;
}
} }

View File

@ -46,6 +46,7 @@ import androidx.media.MediaBrowserServiceCompat;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import de.danoeh.antennapod.core.service.QuickSettingsTileService; import de.danoeh.antennapod.core.service.QuickSettingsTileService;
import de.danoeh.antennapod.core.util.playback.PlayableUtils;
import de.danoeh.antennapod.event.playback.BufferUpdateEvent; import de.danoeh.antennapod.event.playback.BufferUpdateEvent;
import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; import de.danoeh.antennapod.event.playback.PlaybackServiceEvent;
import de.danoeh.antennapod.event.PlayerErrorEvent; import de.danoeh.antennapod.event.PlayerErrorEvent;
@ -82,7 +83,6 @@ import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.NetworkUtils;
import de.danoeh.antennapod.core.util.gui.NotificationUtils; import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import de.danoeh.antennapod.core.util.playback.PlayableUtils;
import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
import de.danoeh.antennapod.core.widget.WidgetUpdater; import de.danoeh.antennapod.core.widget.WidgetUpdater;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
@ -702,7 +702,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} }
private void startPlayingFromPreferences() { private void startPlayingFromPreferences() {
Observable.fromCallable(() -> PlayableUtils.createInstanceFromPreferences(getApplicationContext())) Observable.fromCallable(() -> PlaybackPreferences.createInstanceFromPreferences(getApplicationContext()))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(

View File

@ -42,7 +42,6 @@ import de.danoeh.antennapod.core.util.FeedItemPermutors;
import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.Permutor; import de.danoeh.antennapod.core.util.Permutor;
import de.danoeh.antennapod.core.util.playback.PlayableUtils;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedMedia;
@ -391,7 +390,7 @@ public class DBWriter {
List<FeedItem> updatedItems = new ArrayList<>(); List<FeedItem> updatedItems = new ArrayList<>();
ItemEnqueuePositionCalculator positionCalculator = ItemEnqueuePositionCalculator positionCalculator =
new ItemEnqueuePositionCalculator(UserPreferences.getEnqueueLocation()); new ItemEnqueuePositionCalculator(UserPreferences.getEnqueueLocation());
Playable currentlyPlaying = PlayableUtils.createInstanceFromPreferences(context); Playable currentlyPlaying = PlaybackPreferences.createInstanceFromPreferences(context);
int insertPosition = positionCalculator.calcPosition(queue, currentlyPlaying); int insertPosition = positionCalculator.calcPosition(queue, currentlyPlaying);
for (long itemId : itemIds) { for (long itemId : itemIds) {
if (!itemListContains(queue, itemId)) { if (!itemListContains(queue, itemId)) {

View File

@ -1,79 +1,14 @@
package de.danoeh.antennapod.core.util.playback; package de.danoeh.antennapod.core.util.playback;
import android.content.Context; import de.danoeh.antennapod.core.storage.DBWriter;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.model.playback.Playable; import de.danoeh.antennapod.model.playback.Playable;
/** /**
* Provides utility methods for Playable objects. * Provides utility methods for Playable objects.
*/ */
public abstract class PlayableUtils { public abstract class PlayableUtils {
private static final String TAG = "PlayableUtils";
/**
* Restores a playable object from a sharedPreferences file. This method might load data from the database,
* depending on the type of playable that was restored.
*
* @return The restored Playable object
*/
@Nullable
public static Playable createInstanceFromPreferences(@NonNull Context context) {
long currentlyPlayingMedia = PlaybackPreferences.getCurrentlyPlayingMediaType();
if (currentlyPlayingMedia != PlaybackPreferences.NO_MEDIA_PLAYING) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
return PlayableUtils.createInstanceFromPreferences((int) currentlyPlayingMedia, prefs);
}
return null;
}
/**
* Restores a playable object from a sharedPreferences file. This method might load data from the database,
* depending on the type of playable that was restored.
*
* @param type An integer that represents the type of the Playable object
* that is restored.
* @param pref The SharedPreferences file from which the Playable object
* is restored
* @return The restored Playable object
*/
private static Playable createInstanceFromPreferences(int type, SharedPreferences pref) {
Playable result;
// ADD new Playable types here:
switch (type) {
case FeedMedia.PLAYABLE_TYPE_FEEDMEDIA:
result = createFeedMediaInstance(pref);
break;
default:
result = null;
break;
}
if (result == null) {
Log.e(TAG, "Could not restore Playable object from preferences");
}
return result;
}
private static Playable createFeedMediaInstance(SharedPreferences pref) {
Playable result = null;
long mediaId = pref.getLong(FeedMedia.PREF_MEDIA_ID, -1);
if (mediaId != -1) {
result = DBReader.getFeedMedia(mediaId);
}
return result;
}
/** /**
* Saves the current position of this object. * Saves the current position of this object.
* *

View File

@ -341,7 +341,7 @@ public abstract class PlaybackController {
public Playable getMedia() { public Playable getMedia() {
if (media == null) { if (media == null) {
media = PlayableUtils.createInstanceFromPreferences(activity); media = PlaybackPreferences.createInstanceFromPreferences(activity);
} }
return media; return media;
} }

View File

@ -9,7 +9,7 @@ import androidx.work.WorkManager;
import androidx.work.Worker; import androidx.work.Worker;
import androidx.work.WorkerParameters; import androidx.work.WorkerParameters;
import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils; import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
import de.danoeh.antennapod.core.util.playback.PlayableUtils; import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.model.playback.Playable; import de.danoeh.antennapod.model.playback.Playable;
import de.danoeh.antennapod.playback.base.PlayerStatus; import de.danoeh.antennapod.playback.base.PlayerStatus;
@ -43,7 +43,7 @@ public class WidgetUpdaterWorker extends Worker {
* Loads the current media from the database and updates the widget in a background job. * Loads the current media from the database and updates the widget in a background job.
*/ */
private void updateWidget() { private void updateWidget() {
final Playable media = PlayableUtils.createInstanceFromPreferences(getApplicationContext()); final Playable media = PlaybackPreferences.createInstanceFromPreferences(getApplicationContext());
if (media != null) { if (media != null) {
WidgetUpdater.updateWidget(getApplicationContext(), WidgetUpdater.updateWidget(getApplicationContext(),
new WidgetUpdater.WidgetState(media, PlayerStatus.STOPPED, new WidgetUpdater.WidgetState(media, PlayerStatus.STOPPED,

View File

@ -19,7 +19,7 @@ public interface Playable extends Parcelable, Serializable {
/** /**
* Save information about the playable in a preference so that it can be * Save information about the playable in a preference so that it can be
* restored later via PlayableUtils.createInstanceFromPreferences. * restored later via PlaybackPreferences.createInstanceFromPreferences.
* Implementations must NOT call commit() after they have written the values * Implementations must NOT call commit() after they have written the values
* to the preferences file. * to the preferences file.
*/ */
@ -136,7 +136,7 @@ public interface Playable extends Parcelable, Serializable {
/** /**
* Returns an integer that must be unique among all Playable classes. The * Returns an integer that must be unique among all Playable classes. The
* return value is later used by PlayableUtils to determine the type of the * return value is later used by PlaybackPreferences to determine the type of the
* Playable object that is restored. * Playable object that is restored.
*/ */
int getPlayableType(); int getPlayableType();