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.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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
@ -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)) {
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user