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.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import android.util.Log;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.event.PlayerStatusEvent;
import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.model.playback.MediaType;
@ -187,4 +190,48 @@ public class PlaybackPreferences implements SharedPreferences.OnSharedPreference
}
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 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.PlaybackServiceEvent;
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.NetworkUtils;
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.widget.WidgetUpdater;
import de.danoeh.antennapod.model.feed.Feed;
@ -702,7 +702,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
}
private void startPlayingFromPreferences() {
Observable.fromCallable(() -> PlayableUtils.createInstanceFromPreferences(getApplicationContext()))
Observable.fromCallable(() -> PlaybackPreferences.createInstanceFromPreferences(getApplicationContext()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.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.LongList;
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.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia;
@ -391,7 +390,7 @@ public class DBWriter {
List<FeedItem> updatedItems = new ArrayList<>();
ItemEnqueuePositionCalculator positionCalculator =
new ItemEnqueuePositionCalculator(UserPreferences.getEnqueueLocation());
Playable currentlyPlaying = PlayableUtils.createInstanceFromPreferences(context);
Playable currentlyPlaying = PlaybackPreferences.createInstanceFromPreferences(context);
int insertPosition = positionCalculator.calcPosition(queue, currentlyPlaying);
for (long itemId : itemIds) {
if (!itemListContains(queue, itemId)) {

View File

@ -1,79 +1,14 @@
package de.danoeh.antennapod.core.util.playback;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.model.feed.FeedItem;
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;
/**
* Provides utility methods for Playable objects.
*/
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.
*

View File

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

View File

@ -9,7 +9,7 @@ import androidx.work.WorkManager;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
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.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.
*/
private void updateWidget() {
final Playable media = PlayableUtils.createInstanceFromPreferences(getApplicationContext());
final Playable media = PlaybackPreferences.createInstanceFromPreferences(getApplicationContext());
if (media != null) {
WidgetUpdater.updateWidget(getApplicationContext(),
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
* restored later via PlayableUtils.createInstanceFromPreferences.
* restored later via PlaybackPreferences.createInstanceFromPreferences.
* Implementations must NOT call commit() after they have written the values
* 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
* 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.
*/
int getPlayableType();