diff options
Diffstat (limited to 'core/src/main')
20 files changed, 87 insertions, 68 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 00b32de5f..d8c32f55e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -78,11 +78,11 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr /* * 0: auto download disabled - * 1: auto download enabled + * 1: auto download enabled (default) * > 1: auto download enabled, (approx.) timestamp of the last failed attempt * where last digit denotes the number of failed attempts */ - private long autoDownload = 0; + private long autoDownload = 1; /** * Any tags assigned to this item diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index a7d553120..ae22d5460 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -8,6 +8,7 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; +import android.text.TextUtils; import java.util.Date; import java.util.List; @@ -167,6 +168,11 @@ public class FeedMedia extends FeedFile implements Playable { } public void updateFromOther(FeedMedia other) { + // we try to cover two cases: (1) feed did include file before (2) feed contained wrong URL + // if item.getAutoDownload() is false, the file has been downloaded before + if((TextUtils.isEmpty(download_url) || item.getAutoDownload()) && !TextUtils.isEmpty(other.download_url)) { + item.setNew(); + } super.updateFromOther(other); if (other.size > 0) { size = other.size; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index c3afff276..d69228ceb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -204,8 +204,10 @@ public class DownloadService extends Service { return; } FeedItem item = media.getItem(); - if (status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR && - Integer.valueOf(status.getReasonDetailed()) == HttpURLConnection.HTTP_NOT_FOUND) { + boolean httpNotFound = status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR + && String.valueOf(HttpURLConnection.HTTP_NOT_FOUND).equals(status.getReasonDetailed()); + boolean notEnoughSpace = status.getReason() == DownloadError.ERROR_NOT_ENOUGH_SPACE; + if (httpNotFound || notEnoughSpace) { DBWriter.saveFeedItemAutoDownloadFailed(item).get(); } // to make lists reload the failed item, we fake an item update @@ -361,7 +363,8 @@ public class DownloadService extends Service { int numDownloads = requester.getNumberOfDownloads(); String downloadsLeft; if (numDownloads > 0) { - downloadsLeft = requester.getNumberOfDownloads() + getString(R.string.downloads_left); + downloadsLeft = getResources() + .getQuantityString(R.plurals.downloads_left, numDownloads, numDownloads); } else { downloadsLeft = getString(R.string.downloads_processing); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java index 4e0c8a109..680fb8777 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java @@ -39,7 +39,7 @@ public class PlaybackServiceTaskManager { /** * Notification interval of widget updater in milliseconds. */ - public static final int WIDGET_UPDATER_NOTIFICATION_INTERVAL = 1500; + public static final int WIDGET_UPDATER_NOTIFICATION_INTERVAL = 1000; private static final int SCHED_EX_POOL_SIZE = 2; private final ScheduledThreadPoolExecutor schedExecutor; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index 16e65f9f3..bc4c671a2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -408,7 +408,7 @@ public final class DBReader { return items; } - static LongList getFavoriteIDList() { + public static LongList getFavoriteIDList() { Log.d(TAG, "getFavoriteIDList() called"); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index d1d6bd750..e728abc3b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -993,7 +993,6 @@ public class DBWriter { public static Future<?> saveFeedItemAutoDownloadFailed(final FeedItem feedItem) { return dbExec.submit(() -> { int failedAttempts = feedItem.getFailedAutoDownloadAttempts() + 1; - Log.d(TAG, "failedAttempts: " + failedAttempts); long autoDownload; if(!feedItem.getAutoDownload() || failedAttempts >= 10) { autoDownload = 0; // giving up, disable auto download @@ -1001,8 +1000,6 @@ public class DBWriter { } else { long now = System.currentTimeMillis(); autoDownload = (now / 10) * 10 + failedAttempts; - Log.d(TAG, "now: " + now); - Log.d(TAG, "autoDownload: " + autoDownload); } final PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index 9b9849c49..99c4cd67a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -19,6 +19,8 @@ public class NSITunes extends Namespace { private static final String AUTHOR = "author"; public static final String DURATION = "duration"; + public static final String SUBTITLE = "subtitle"; + public static final String SUMMARY = "summary"; @Override @@ -67,13 +69,28 @@ public class NSITunes extends Namespace { } else { return; } - state.getTempObjects().put(DURATION, duration); } catch (NumberFormatException e) { e.printStackTrace(); } + } else if (localName.equals(SUBTITLE)) { + String subtitle = state.getContentBuf().toString(); + if (state.getCurrentItem() != null) { + if (TextUtils.isEmpty(state.getCurrentItem().getDescription())) { + state.getCurrentItem().setDescription(subtitle); + } + } else { + if (TextUtils.isEmpty(state.getFeed().getDescription())) { + state.getFeed().setDescription(subtitle); + } + } + } else if (localName.equals(SUMMARY)) { + String summary = state.getContentBuf().toString(); + if (state.getCurrentItem() != null) { + state.getCurrentItem().setDescription(summary); + } else { + state.getFeed().setDescription(summary); + } } - } - } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java index a690e7646..b23a142af 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java @@ -4,7 +4,6 @@ import android.util.Log; import org.xml.sax.Attributes; -import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; @@ -88,16 +87,15 @@ public class NSAtom extends Namespace { size = Long.parseLong(strSize); } } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) Log.d(TAG, "Length attribute could not be parsed."); + Log.d(TAG, "Length attribute could not be parsed."); } String type = attributes.getValue(LINK_TYPE); if (SyndTypeUtils.enclosureTypeValid(type) - || (type = SyndTypeUtils - .getValidMimeTypeFromUrl(href)) != null) { - state.getCurrentItem().setMedia( - new FeedMedia(state.getCurrentItem(), href, - size, type) - ); + || (type = SyndTypeUtils.getValidMimeTypeFromUrl(href)) != null) { + FeedItem currItem = state.getCurrentItem(); + if(!currItem.hasMedia()) { + currItem.setMedia(new FeedMedia(currItem, href, size, type)); + } } } else if (rel.equals(LINK_REL_PAYMENT)) { state.getCurrentItem().setPaymentLink(href); @@ -111,9 +109,11 @@ public class NSAtom extends Namespace { * LINK_TYPE_HTML or LINK_TYPE_XHTML */ if ((type == null && state.getFeed().getLink() == null) - || (type != null && (type.equals(LINK_TYPE_HTML) || type.equals(LINK_TYPE_XHTML)))) { + || (type != null && (type.equals(LINK_TYPE_HTML) + || type.equals(LINK_TYPE_XHTML)))) { state.getFeed().setLink(href); - } else if (type != null && (type.equals(LINK_TYPE_ATOM) || type.equals(LINK_TYPE_RSS))) { + } else if (type != null && (type.equals(LINK_TYPE_ATOM) + || type.equals(LINK_TYPE_RSS))) { // treat as podlove alternate feed String title = attributes.getValue(LINK_TITLE); if (title == null) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 1952c068f..31cb25d40 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java @@ -18,7 +18,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.view.SurfaceHolder; -import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.SeekBar; @@ -78,18 +77,18 @@ public abstract class PlaybackController { this.activity = activity; this.reinitOnPause = reinitOnPause; schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOLSIZE, - r -> { - Thread t = new Thread(r); - t.setPriority(Thread.MIN_PRIORITY); - return t; - }, new RejectedExecutionHandler() { - @Override - public void rejectedExecution(Runnable r, - ThreadPoolExecutor executor) { - Log.w(TAG, + r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; + }, new RejectedExecutionHandler() { + @Override + public void rejectedExecution(Runnable r, + ThreadPoolExecutor executor) { + Log.w(TAG, "Rejected execution of runnable in schedExecutor"); - } } + } ); } @@ -415,7 +414,6 @@ public abstract class PlaybackController { Log.d(TAG, "status: " + status.toString()); switch (status) { - case ERROR: postStatusMsg(R.string.player_error_msg); handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN); @@ -575,37 +573,32 @@ public abstract class PlaybackController { } public OnClickListener newOnPlayButtonClickListener() { - return new OnClickListener() { - @Override - public void onClick(View v) { - if (playbackService != null) { - switch (status) { - case PLAYING: - playbackService.pause(true, reinitOnPause); - break; - case PAUSED: - case PREPARED: - playbackService.resume(); - break; - case PREPARING: - playbackService.setStartWhenPrepared(!playbackService - .isStartWhenPrepared()); - if (reinitOnPause - && playbackService.isStartWhenPrepared() == false) { - playbackService.reinit(); - } - break; - case INITIALIZED: - playbackService.setStartWhenPrepared(true); - playbackService.prepare(); - break; + return v -> { + if (playbackService == null) { + Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!"); + return; + } + switch (status) { + case PLAYING: + playbackService.pause(true, reinitOnPause); + break; + case PAUSED: + case PREPARED: + playbackService.resume(); + break; + case PREPARING: + playbackService.setStartWhenPrepared(!playbackService + .isStartWhenPrepared()); + if (reinitOnPause + && playbackService.isStartWhenPrepared() == false) { + playbackService.reinit(); } - } else { - Log.w(TAG, - "Play/Pause button was pressed, but playbackservice was null!"); - } + break; + case INITIALIZED: + playbackService.setStartWhenPrepared(true); + playbackService.prepare(); + break; } - }; } diff --git a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png Binary files differnew file mode 100755 index 000000000..a32968a19 --- /dev/null +++ b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png diff --git a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png Binary files differnew file mode 100755 index 000000000..e39de4dcf --- /dev/null +++ b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png diff --git a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png Binary files differnew file mode 100755 index 000000000..69b81c10d --- /dev/null +++ b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png diff --git a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png Binary files differnew file mode 100755 index 000000000..5355abfd6 --- /dev/null +++ b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png diff --git a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png Binary files differnew file mode 100755 index 000000000..ed34e22a1 --- /dev/null +++ b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png diff --git a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png Binary files differnew file mode 100755 index 000000000..3dc7bf5cb --- /dev/null +++ b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png Binary files differnew file mode 100755 index 000000000..f90617f45 --- /dev/null +++ b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png Binary files differnew file mode 100755 index 000000000..81709e0ae --- /dev/null +++ b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png Binary files differnew file mode 100755 index 000000000..c9b68abf0 --- /dev/null +++ b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png Binary files differnew file mode 100755 index 000000000..87b0756eb --- /dev/null +++ b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 03c407a2c..e4097feed 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -187,7 +187,10 @@ <string name="download_error_io_error">IO Error</string> <string name="download_error_request_error">Request Error</string> <string name="download_error_db_access">Database Access Error</string> - <string name="downloads_left">\u0020Downloads left</string> + <plurals name="downloads_left"> + <item quantity="one">%d download left</item> + <item quantity="other">%d downloads left</item> + </plurals> <string name="downloads_processing">Processing downloads</string> <string name="download_notification_title">Downloading podcast data</string> <string name="download_report_content">%1$d downloads succeeded, %2$d failed</string> @@ -267,7 +270,7 @@ <!-- Variable Speed --> <string name="download_plugin_label">Download Plugin</string> <string name="no_playback_plugin_title">Plugin Not Installed</string> - <string name="no_playback_plugin_or_sonic_msg">For variable speed playback to work, you have to install a third party library or enable the experimental Sonic player [Android 4.1+].\n\nTap \'Download Plugin\' to download a free plugin from the Play Store.\n\nAny problems found using this plugin are not the responsibility of AntennaPod and should be reported to the plugin owner.</string> + <string name="no_playback_plugin_or_sonic_msg">For variable speed playback to work, we recommend to enable the built-in Sonic mediaplayer [Android 4.1+].\n\nAlternatively, you can download the third party plugin <i>Prestissimo</i> from the Play Store.\nAny problems with Prestissimo are not the responsibility of AntennaPod and should be reported to the plugin owner.</string> <string name="set_playback_speed_label">Playback Speeds</string> <string name="enable_sonic">Enable Sonic</string> @@ -283,7 +286,7 @@ <string name="services_label">Services</string> <string name="flattr_label">Flattr</string> <string name="pref_episode_cleanup_title">Episode Cleanup</string> - <string name="pref_episode_cleanup_summary">Episodes that aren\'t in the queue and aren\'t favorites should be eligible for removal if space is needed</string> + <string name="pref_episode_cleanup_summary">Episodes that aren\'t in the queue and aren\'t favorites should be eligible for removal if Auto Download needs space for new episodes</string> <string name="pref_pauseOnDisconnect_sum">Pause playback when headphones or bluetooth are disconnected</string> <string name="pref_unpauseOnHeadsetReconnect_sum">Resume playback when the headphones are reconnected</string> <string name="pref_unpauseOnBluetoothReconnect_sum">Resume playback when bluetooth reconnects</string> @@ -380,7 +383,7 @@ <string name="send_email">Send e-mail</string> <string name="experimental_pref">Experimental</string> <string name="pref_sonic_title">Sonic media player</string> - <string name="pref_sonic_message">Use built-in sonic media player as a replacement for Prestissimo</string> + <string name="pref_sonic_message">Use built-in sonic media player as a replacement for Android\'s native mediaplayer and Prestissimo</string> <string name="pref_current_value">Current value: %1$s</string> <!-- Auto-Flattr dialog --> |