From 67cc7c98857b3fa0897ab96b2b87f52d99e4de2f Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 28 Mar 2015 10:59:07 +0100 Subject: Sync episode actions with gpodder, smart mark as played * Create episode actions when episodes are downloaded, played, deleted and marked as read * Sync (download and upload) episode actions * MediaPlayerActivity deletes almost completely played episode on close * Improved parsing of datetime strings * Smart mark as played can be disabled or set in the preferences --- .../antennapod/adapter/DefaultActionButtonCallback.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index 14644dd68..d3843934a 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -11,6 +11,8 @@ import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; +import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; @@ -61,6 +63,19 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } else { if (!item.isRead()) { DBWriter.markItemRead(context, item, true, true); + + if(GpodnetPreferences.loggedIn()) { + // gpodder: send played action + FeedMedia media = item.getMedia(); + GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, GpodnetEpisodeAction.Action.PLAY) + .currentDeviceId() + .currentTimestamp() + .started(media.getDuration() / 1000) + .position(media.getDuration() / 1000) + .total(media.getDuration() / 1000) + .build(); + GpodnetPreferences.enqueueEpisodeAction(action); + } } } } -- cgit v1.2.3 From fd7cdd3c715565b621cb7ba2f485dd1bad696044 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sun, 3 May 2015 18:58:48 +0200 Subject: Show confirmation dialog when downloading over mobile data connection is disabled --- .../adapter/DefaultActionButtonCallback.java | 69 +++++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index d3843934a..20f07f71c 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -1,6 +1,8 @@ package de.danoeh.antennapod.adapter; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.widget.Toast; @@ -10,22 +12,31 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; import de.danoeh.antennapod.core.preferences.GpodnetPreferences; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.NetworkUtils; /** * Default implementation of an ActionButtonCallback */ public class DefaultActionButtonCallback implements ActionButtonCallback { + private static final String TAG = "DefaultActionButtonCallback"; private final Context context; + private final int TEN_MINUTES_IN_MILLIS = 60 * 1000 * 10; + + // remember timestamp when user allowed downloading via mobile connection + private static long allowMobileDownloadsTimestamp; + private static long onlyAddToQueueTimeStamp; + public DefaultActionButtonCallback(Context context) { Validate.notNull(context); this.context = context; @@ -34,17 +45,26 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { @Override public void onActionButtonPressed(final FeedItem item) { - if (item.hasMedia()) { final FeedMedia media = item.getMedia(); boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); if (!isDownloading && !media.isDownloaded()) { - try { - DBTasks.downloadFeedItems(context, item); - Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); - } catch (DownloadRequestException e) { - e.printStackTrace(); - DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + if (UserPreferences.isAllowMobileUpdate() || NetworkUtils.connectedToWifi(context) || + (System.currentTimeMillis()-allowMobileDownloadsTimestamp) < TEN_MINUTES_IN_MILLIS) { + try { + DBTasks.downloadFeedItems(context, item); + Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + } + } else { + if(System.currentTimeMillis() - onlyAddToQueueTimeStamp < TEN_MINUTES_IN_MILLIS) { + DBWriter.addQueueItem(context, item.getId()); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + } else { + confirmMobileDownload(context, item); + } } } else if (isDownloading) { DownloadRequester.getInstance().cancelDownload(context, media); @@ -79,4 +99,37 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } } } + + private void confirmMobileDownload(final Context context, final FeedItem item) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder + .setTitle(R.string.confirm_mobile_download_dialog_title) + .setMessage(context.getText(R.string.confirm_mobile_download_dialog_message)) + .setPositiveButton(R.string.confirm_mobile_download_dialog_enable_temporarily, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + allowMobileDownloadsTimestamp = System.currentTimeMillis(); + try { + DBTasks.downloadFeedItems(context, item); + Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); + } + } + }) + .setNeutralButton(R.string.confirm_mobile_download_dialog_only_add_to_queue, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + onlyAddToQueueTimeStamp = System.currentTimeMillis(); + DBWriter.addQueueItem(context, item.getId()); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + } + }) + .setNegativeButton(R.string.cancel_label, null) + .create() + .show(); + } } -- cgit v1.2.3 From a766977e6dcb60a537922118185f723ef3e873c6 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sun, 3 May 2015 21:19:20 +0200 Subject: Check if items are already in the queue --- .../adapter/DefaultActionButtonCallback.java | 55 +++++++++++++--------- 1 file changed, 34 insertions(+), 21 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index 20f07f71c..6df18e759 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -14,12 +14,13 @@ import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; import de.danoeh.antennapod.core.preferences.GpodnetPreferences; -import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.NetworkUtils; /** @@ -31,7 +32,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { private final Context context; - private final int TEN_MINUTES_IN_MILLIS = 60 * 1000 * 10; + private static final int TEN_MINUTES_IN_MILLIS = 60 * 1000 * 10; // remember timestamp when user allowed downloading via mobile connection private static long allowMobileDownloadsTimestamp; @@ -42,6 +43,14 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { this.context = context; } + public static boolean userAllowedMobileDownloads() { + return System.currentTimeMillis() - allowMobileDownloadsTimestamp < TEN_MINUTES_IN_MILLIS; + } + + public static boolean userChoseAddToQueue() { + return System.currentTimeMillis() - onlyAddToQueueTimeStamp < TEN_MINUTES_IN_MILLIS; + } + @Override public void onActionButtonPressed(final FeedItem item) { @@ -49,8 +58,8 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { final FeedMedia media = item.getMedia(); boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); if (!isDownloading && !media.isDownloaded()) { - if (UserPreferences.isAllowMobileUpdate() || NetworkUtils.connectedToWifi(context) || - (System.currentTimeMillis()-allowMobileDownloadsTimestamp) < TEN_MINUTES_IN_MILLIS) { + LongList queueIds = DBReader.getQueueIDList(context); + if (NetworkUtils.isDownloadAllowed(context) || userAllowedMobileDownloads()) { try { DBTasks.downloadFeedItems(context, item); Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); @@ -58,13 +67,11 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { e.printStackTrace(); DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); } + } else if(userChoseAddToQueue() && !queueIds.contains(item.getId())) { + DBWriter.addQueueItem(context, item.getId()); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); } else { - if(System.currentTimeMillis() - onlyAddToQueueTimeStamp < TEN_MINUTES_IN_MILLIS) { - DBWriter.addQueueItem(context, item.getId()); - Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); - } else { - confirmMobileDownload(context, item); - } + confirmMobileDownload(context, item); } } else if (isDownloading) { DownloadRequester.getInstance().cancelDownload(context, media); @@ -118,17 +125,23 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { DownloadRequestErrorDialogCreator.newRequestErrorDialog(context, e.getMessage()); } } - }) - .setNeutralButton(R.string.confirm_mobile_download_dialog_only_add_to_queue, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - onlyAddToQueueTimeStamp = System.currentTimeMillis(); - DBWriter.addQueueItem(context, item.getId()); - Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); - } - }) - .setNegativeButton(R.string.cancel_label, null) + }); + LongList queueIds = DBReader.getQueueIDList(context); + if(!queueIds.contains(item.getId())) { + builder.setNeutralButton(R.string.confirm_mobile_download_dialog_only_add_to_queue, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + onlyAddToQueueTimeStamp = System.currentTimeMillis(); + DBWriter.addQueueItem(context, item.getId()); + Toast.makeText(context, R.string.added_to_queue_label, Toast.LENGTH_SHORT).show(); + } + }) + .setMessage(context.getText(R.string.confirm_mobile_download_dialog_message_not_in_queue)); + } else { + builder.setMessage(context.getText(R.string.confirm_mobile_download_dialog_message)); + } + builder.setNegativeButton(R.string.cancel_label, null) .create() .show(); } -- cgit v1.2.3 From c8259daaeee9870bc806c5d8b4bed669e68d061c Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 4 May 2015 23:47:34 +0200 Subject: Cancel auto download --- .../antennapod/adapter/DefaultActionButtonCallback.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index 6df18e759..e39b9e684 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -12,9 +12,11 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; + +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; import de.danoeh.antennapod.core.preferences.GpodnetPreferences; -import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; @@ -75,7 +77,12 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } } else if (isDownloading) { DownloadRequester.getInstance().cancelDownload(context, media); - Toast.makeText(context, R.string.download_cancelled_msg, Toast.LENGTH_SHORT).show(); + if(UserPreferences.isEnableAutodownload()) { + DBWriter.setFeedItemAutoDownload(context, media.getItem(), false); + Toast.makeText(context, R.string.download_cancelled_autodownload_enabled_msg, Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(context, R.string.download_cancelled_msg, Toast.LENGTH_LONG).show(); + } } else { // media is downloaded if (item.hasMedia() && item.getMedia().isCurrentlyPlaying()) { context.sendBroadcast(new Intent(PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE)); -- cgit v1.2.3 From 94569cf995f2fb6c7082578321873e42ffad04df Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 9 May 2015 00:46:02 +0200 Subject: CANCELLED --- .../de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index e39b9e684..3d233817b 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -79,9 +79,9 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { DownloadRequester.getInstance().cancelDownload(context, media); if(UserPreferences.isEnableAutodownload()) { DBWriter.setFeedItemAutoDownload(context, media.getItem(), false); - Toast.makeText(context, R.string.download_cancelled_autodownload_enabled_msg, Toast.LENGTH_LONG).show(); + Toast.makeText(context, R.string.download_canceled_autodownload_enabled_msg, Toast.LENGTH_LONG).show(); } else { - Toast.makeText(context, R.string.download_cancelled_msg, Toast.LENGTH_LONG).show(); + Toast.makeText(context, R.string.download_canceled_msg, Toast.LENGTH_LONG).show(); } } else { // media is downloaded if (item.hasMedia() && item.getMedia().isCurrentlyPlaying()) { -- cgit v1.2.3 From 1bf803a6b21c1547cb66d679b927e983f670e2a2 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 28 May 2015 11:41:36 +0200 Subject: Remove cancel, adjust strings --- .../de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index 3d233817b..223fe17f6 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -119,7 +119,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { builder .setTitle(R.string.confirm_mobile_download_dialog_title) .setMessage(context.getText(R.string.confirm_mobile_download_dialog_message)) - .setPositiveButton(R.string.confirm_mobile_download_dialog_enable_temporarily, + .setPositiveButton(context.getText(R.string.confirm_mobile_download_dialog_enable_temporarily), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -135,7 +135,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { }); LongList queueIds = DBReader.getQueueIDList(context); if(!queueIds.contains(item.getId())) { - builder.setNeutralButton(R.string.confirm_mobile_download_dialog_only_add_to_queue, + builder.setNeutralButton(context.getText(R.string.confirm_mobile_download_dialog_only_add_to_queue), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -148,8 +148,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } else { builder.setMessage(context.getText(R.string.confirm_mobile_download_dialog_message)); } - builder.setNegativeButton(R.string.cancel_label, null) - .create() + builder.create() .show(); } } -- cgit v1.2.3