Merge pull request #2988 from ByteHamster/deleteMedia
Only delete from queue if deletion of media succeeds
This commit is contained in:
commit
1c9b4be17a
|
@ -7,6 +7,7 @@ import android.content.SharedPreferences;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import io.reactivex.annotations.NonNull;
|
||||||
import org.shredzone.flattr4j.model.Flattr;
|
import org.shredzone.flattr4j.model.Flattr;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -74,75 +75,76 @@ public class DBWriter {
|
||||||
private DBWriter() {
|
private DBWriter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Future<?> doDeleteFeedMediaOfItem(final Context context,
|
|
||||||
final long mediaId) {
|
|
||||||
return dbExec.submit(() -> {
|
|
||||||
final FeedMedia media = DBReader.getFeedMedia(mediaId);
|
|
||||||
if (media != null) {
|
|
||||||
Log.i(TAG, String.format("Requested to delete FeedMedia [id=%d, title=%s, downloaded=%s",
|
|
||||||
media.getId(), media.getEpisodeTitle(), String.valueOf(media.isDownloaded())));
|
|
||||||
if (media.isDownloaded()) {
|
|
||||||
// delete downloaded media file
|
|
||||||
File mediaFile = new File(media.getFile_url());
|
|
||||||
if (mediaFile.exists() && !mediaFile.delete()) {
|
|
||||||
MessageEvent evt = new MessageEvent(context.getString(R.string.delete_failed));
|
|
||||||
EventBus.getDefault().post(evt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
media.setDownloaded(false);
|
|
||||||
media.setFile_url(null);
|
|
||||||
media.setHasEmbeddedPicture(false);
|
|
||||||
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
|
||||||
adapter.open();
|
|
||||||
adapter.setMedia(media);
|
|
||||||
adapter.close();
|
|
||||||
|
|
||||||
// If media is currently being played, change playback
|
|
||||||
// type to 'stream' and shutdown playback service
|
|
||||||
SharedPreferences prefs = PreferenceManager
|
|
||||||
.getDefaultSharedPreferences(context);
|
|
||||||
if (PlaybackPreferences.getCurrentlyPlayingMedia() == FeedMedia.PLAYABLE_TYPE_FEEDMEDIA) {
|
|
||||||
if (media.getId() == PlaybackPreferences
|
|
||||||
.getCurrentlyPlayingFeedMediaId()) {
|
|
||||||
SharedPreferences.Editor editor = prefs.edit();
|
|
||||||
editor.putBoolean(
|
|
||||||
PlaybackPreferences.PREF_CURRENT_EPISODE_IS_STREAM,
|
|
||||||
true);
|
|
||||||
editor.commit();
|
|
||||||
}
|
|
||||||
if (PlaybackPreferences.getCurrentlyPlayingFeedMediaId() == media.getId()) {
|
|
||||||
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Gpodder: queue delete action for synchronization
|
|
||||||
if(GpodnetPreferences.loggedIn()) {
|
|
||||||
FeedItem item = media.getItem();
|
|
||||||
GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, GpodnetEpisodeAction.Action.DELETE)
|
|
||||||
.currentDeviceId()
|
|
||||||
.currentTimestamp()
|
|
||||||
.build();
|
|
||||||
GpodnetPreferences.enqueueEpisodeAction(action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EventBus.getDefault().post(FeedItemEvent.deletedMedia(Collections.singletonList(media.getItem())));
|
|
||||||
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes a downloaded FeedMedia file from the storage device.
|
* Deletes a downloaded FeedMedia file from the storage device.
|
||||||
*
|
*
|
||||||
* @param context A context that is used for opening a database connection.
|
* @param context A context that is used for opening a database connection.
|
||||||
* @param mediaId ID of the FeedMedia object whose downloaded file should be deleted.
|
* @param mediaId ID of the FeedMedia object whose downloaded file should be deleted.
|
||||||
*/
|
*/
|
||||||
public static Future<?> deleteFeedMediaOfItem(final Context context,
|
public static Future<?> deleteFeedMediaOfItem(@NonNull final Context context,
|
||||||
final long mediaId) {
|
final long mediaId) {
|
||||||
Future res = doDeleteFeedMediaOfItem(context, mediaId);
|
return dbExec.submit(() -> {
|
||||||
if (UserPreferences.shouldDeleteRemoveFromQueue()) {
|
final FeedMedia media = DBReader.getFeedMedia(mediaId);
|
||||||
DBWriter.removeQueueItem(context, DBReader.getFeedMedia(mediaId).getItem(), false);
|
if (media != null) {
|
||||||
|
boolean result = deleteFeedMediaSynchronous(context, media);
|
||||||
|
|
||||||
|
if (result && UserPreferences.shouldDeleteRemoveFromQueue()) {
|
||||||
|
DBWriter.removeQueueItemSynchronous(context, media.getItem(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean deleteFeedMediaSynchronous(@NonNull Context context, @NonNull FeedMedia media) {
|
||||||
|
Log.i(TAG, String.format("Requested to delete FeedMedia [id=%d, title=%s, downloaded=%s",
|
||||||
|
media.getId(), media.getEpisodeTitle(), String.valueOf(media.isDownloaded())));
|
||||||
|
if (media.isDownloaded()) {
|
||||||
|
// delete downloaded media file
|
||||||
|
File mediaFile = new File(media.getFile_url());
|
||||||
|
if (mediaFile.exists() && !mediaFile.delete()) {
|
||||||
|
MessageEvent evt = new MessageEvent(context.getString(R.string.delete_failed));
|
||||||
|
EventBus.getDefault().post(evt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
media.setDownloaded(false);
|
||||||
|
media.setFile_url(null);
|
||||||
|
media.setHasEmbeddedPicture(false);
|
||||||
|
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||||
|
adapter.open();
|
||||||
|
adapter.setMedia(media);
|
||||||
|
adapter.close();
|
||||||
|
|
||||||
|
// If media is currently being played, change playback
|
||||||
|
// type to 'stream' and shutdown playback service
|
||||||
|
SharedPreferences prefs = PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(context);
|
||||||
|
if (PlaybackPreferences.getCurrentlyPlayingMedia() == FeedMedia.PLAYABLE_TYPE_FEEDMEDIA) {
|
||||||
|
if (media.getId() == PlaybackPreferences
|
||||||
|
.getCurrentlyPlayingFeedMediaId()) {
|
||||||
|
SharedPreferences.Editor editor = prefs.edit();
|
||||||
|
editor.putBoolean(
|
||||||
|
PlaybackPreferences.PREF_CURRENT_EPISODE_IS_STREAM,
|
||||||
|
true);
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
if (PlaybackPreferences.getCurrentlyPlayingFeedMediaId() == media.getId()) {
|
||||||
|
IntentUtils.sendLocalBroadcast(context, PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Gpodder: queue delete action for synchronization
|
||||||
|
if(GpodnetPreferences.loggedIn()) {
|
||||||
|
FeedItem item = media.getItem();
|
||||||
|
GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, GpodnetEpisodeAction.Action.DELETE)
|
||||||
|
.currentDeviceId()
|
||||||
|
.currentTimestamp()
|
||||||
|
.build();
|
||||||
|
GpodnetPreferences.enqueueEpisodeAction(action);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
EventBus.getDefault().post(FeedItemEvent.deletedMedia(Collections.singletonList(media.getItem())));
|
||||||
|
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -428,31 +430,33 @@ public class DBWriter {
|
||||||
*/
|
*/
|
||||||
public static Future<?> removeQueueItem(final Context context,
|
public static Future<?> removeQueueItem(final Context context,
|
||||||
final FeedItem item, final boolean performAutoDownload) {
|
final FeedItem item, final boolean performAutoDownload) {
|
||||||
return dbExec.submit(() -> {
|
return dbExec.submit(() -> removeQueueItemSynchronous(context, item, performAutoDownload));
|
||||||
final PodDBAdapter adapter = PodDBAdapter.getInstance();
|
}
|
||||||
adapter.open();
|
|
||||||
final List<FeedItem> queue = DBReader.getQueue(adapter);
|
|
||||||
|
|
||||||
if (queue != null) {
|
private static void removeQueueItemSynchronous(final Context context,
|
||||||
int position = queue.indexOf(item);
|
final FeedItem item, final boolean performAutoDownload) {
|
||||||
if (position >= 0) {
|
final PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||||
queue.remove(position);
|
adapter.open();
|
||||||
adapter.setQueue(queue);
|
final List<FeedItem> queue = DBReader.getQueue(adapter);
|
||||||
item.removeTag(FeedItem.TAG_QUEUE);
|
|
||||||
EventBus.getDefault().post(QueueEvent.removed(item));
|
if (queue != null) {
|
||||||
EventBus.getDefault().post(FeedItemEvent.updated(item));
|
int position = queue.indexOf(item);
|
||||||
} else {
|
if (position >= 0) {
|
||||||
Log.w(TAG, "Queue was not modified by call to removeQueueItem");
|
queue.remove(position);
|
||||||
}
|
adapter.setQueue(queue);
|
||||||
|
item.removeTag(FeedItem.TAG_QUEUE);
|
||||||
|
EventBus.getDefault().post(QueueEvent.removed(item));
|
||||||
|
EventBus.getDefault().post(FeedItemEvent.updated(item));
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "removeQueueItem: Could not load queue");
|
Log.w(TAG, "Queue was not modified by call to removeQueueItem");
|
||||||
}
|
}
|
||||||
adapter.close();
|
} else {
|
||||||
if (performAutoDownload) {
|
Log.e(TAG, "removeQueueItem: Could not load queue");
|
||||||
DBTasks.autodownloadUndownloadedItems(context);
|
}
|
||||||
}
|
adapter.close();
|
||||||
});
|
if (performAutoDownload) {
|
||||||
|
DBTasks.autodownloadUndownloadedItems(context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Future<?> addFavoriteItem(final FeedItem item) {
|
public static Future<?> addFavoriteItem(final FeedItem item) {
|
||||||
|
|
Loading…
Reference in New Issue