Decouple restoring Playable from Preferences and storing position
Breaks dependency cycle
This commit is contained in:
parent
cd9845ed4c
commit
5b8cee0de0
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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)) {
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -341,7 +341,7 @@ public abstract class PlaybackController {
|
||||
|
||||
public Playable getMedia() {
|
||||
if (media == null) {
|
||||
media = PlayableUtils.createInstanceFromPreferences(activity);
|
||||
media = PlaybackPreferences.createInstanceFromPreferences(activity);
|
||||
}
|
||||
return media;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user