From a252191d79f09c0f06cf13a700dd48dfdefd3fe4 Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Tue, 22 Mar 2016 02:07:26 -0400 Subject: code cleaning: - lambda expressions, method references, - multi catches, - remove unnecessary keywords (public keyword on interface method signatures, static on interfaces or enums, final on private method signatures), - == false expressions, - diamond type (<>) expressions, - replace StringBuffer with StringBuilder for local variables used by a single thread, - replace Arrays.asList with Collections.singletonList whenever applicable, - inline variable returns (whenever the variable name's meaning is not important to understand the code), - replace some chains of if/else if/... with switch/case, - break append(a + b) into append(a).append(b) for StringBuilder objects, - unused import statements, - reduce log TAGs to 23 characters, - MaterialDialog callback deprecated, - ActionBarActivity for AppCompatActivity, --- .../antennapod/core/ApplicationCallbacks.java | 4 +- .../danoeh/antennapod/core/DBTasksCallbacks.java | 4 +- .../antennapod/core/DownloadServiceCallbacks.java | 10 +- .../de/danoeh/antennapod/core/FlattrCallbacks.java | 12 +- .../danoeh/antennapod/core/GpodnetCallbacks.java | 4 +- .../antennapod/core/PlaybackServiceCallbacks.java | 6 +- .../antennapod/core/asynctask/FeedRemover.java | 4 +- .../core/asynctask/FlattrClickWorker.java | 8 +- .../core/asynctask/FlattrStatusFetcher.java | 12 +- .../antennapod/core/asynctask/ImageResource.java | 6 +- .../antennapod/core/backup/OpmlBackupAgent.java | 7 +- .../antennapod/core/dialog/ConfirmationDialog.java | 24 +- .../dialog/DownloadRequestErrorDialogCreator.java | 9 +- .../antennapod/core/feed/EventDistributor.java | 10 +- .../java/de/danoeh/antennapod/core/feed/Feed.java | 4 +- .../danoeh/antennapod/core/feed/FeedComponent.java | 3 +- .../de/danoeh/antennapod/core/feed/FeedItem.java | 21 +- .../de/danoeh/antennapod/core/feed/FeedMedia.java | 21 +- .../antennapod/core/feed/FeedPreferences.java | 2 +- .../antennapod/core/glide/ApOkHttpUrlLoader.java | 3 +- .../antennapod/core/gpoddernet/GpodnetService.java | 15 +- .../core/gpoddernet/model/GpodnetDevice.java | 23 +- .../gpoddernet/model/GpodnetEpisodeAction.java | 3 +- .../model/GpodnetEpisodeActionPostResponse.java | 2 +- .../antennapod/core/menuhandler/MenuItemUtils.java | 4 +- .../de/danoeh/antennapod/core/opml/OpmlReader.java | 6 +- .../core/preferences/GpodnetPreferences.java | 10 +- .../core/preferences/UserPreferences.java | 5 +- .../core/service/download/DownloadService.java | 222 ++++++--------- .../core/service/download/DownloaderCallback.java | 2 +- .../core/service/download/HttpDownloader.java | 11 +- .../core/service/download/ProxyConfig.java | 2 +- .../core/service/playback/PlaybackService.java | 2 +- .../playback/PlaybackServiceMediaPlayer.java | 315 ++++++++------------- .../playback/PlaybackServiceTaskManager.java | 55 +--- .../core/storage/APCleanupAlgorithm.java | 2 - .../core/storage/APDownloadAlgorithm.java | 115 ++++---- .../core/storage/APQueueCleanupAlgorithm.java | 3 - .../core/storage/AutomaticDownloadAlgorithm.java | 2 +- .../de/danoeh/antennapod/core/storage/DBTasks.java | 33 +-- .../danoeh/antennapod/core/storage/DBWriter.java | 9 +- .../antennapod/core/storage/DownloadRequester.java | 7 +- .../antennapod/core/storage/FeedSearcher.java | 15 +- .../antennapod/core/storage/PodDBAdapter.java | 64 ++--- .../core/syndication/handler/HandlerState.java | 6 +- .../core/syndication/handler/TypeGetter.java | 41 +-- .../danoeh/antennapod/core/util/ChapterUtils.java | 13 +- .../danoeh/antennapod/core/util/DownloadError.java | 2 +- .../danoeh/antennapod/core/util/EpisodeFilter.java | 2 +- .../de/danoeh/antennapod/core/util/IntList.java | 2 +- .../de/danoeh/antennapod/core/util/LongList.java | 2 +- .../danoeh/antennapod/core/util/NetworkUtils.java | 4 +- .../danoeh/antennapod/core/util/QueueSorter.java | 54 ++-- .../antennapod/core/util/ShownotesProvider.java | 2 +- .../de/danoeh/antennapod/core/util/URIUtil.java | 7 +- .../core/util/gui/MoreContentListFooterUtil.java | 13 +- .../core/util/id3reader/ChapterReader.java | 99 ++++--- .../core/util/playback/ExternalMedia.java | 14 +- .../antennapod/core/util/playback/Playable.java | 54 ++-- .../core/util/playback/PlaybackController.java | 70 ++--- .../antennapod/core/util/playback/Timeline.java | 2 +- .../VorbisCommentChapterReader.java | 4 +- .../vorbiscommentreader/VorbisCommentReader.java | 6 +- 63 files changed, 600 insertions(+), 898 deletions(-) (limited to 'core/src/main') diff --git a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java index 1064e98ac..3acc84e3b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java @@ -12,12 +12,12 @@ public interface ApplicationCallbacks { /** * Returns a non-null instance of the application class */ - public Application getApplicationInstance(); + Application getApplicationInstance(); /** * Returns a non-null intent that starts the storage error * activity. */ - public Intent getStorageErrorActivity(Context context); + Intent getStorageErrorActivity(Context context); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java index edf3e3199..11a6b2c9f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java @@ -11,10 +11,10 @@ public interface DBTasksCallbacks { /** * Returns the client's implementation of the AutomaticDownloadAlgorithm interface. */ - public AutomaticDownloadAlgorithm getAutomaticDownloadAlgorithm(); + AutomaticDownloadAlgorithm getAutomaticDownloadAlgorithm(); /** * Returns the client's implementation of the EpisodeCacheCleanupAlgorithm interface. */ - public EpisodeCleanupAlgorithm getEpisodeCacheCleanupAlgorithm(); + EpisodeCleanupAlgorithm getEpisodeCacheCleanupAlgorithm(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java index 286e830c5..e56445489 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java @@ -19,7 +19,7 @@ public interface DownloadServiceCallbacks { * * @return A non-null PendingIntent for the notification. */ - public PendingIntent getNotificationContentIntent(Context context); + PendingIntent getNotificationContentIntent(Context context); /** * Returns a PendingIntent for a notification that tells the user to enter a username @@ -30,7 +30,7 @@ public interface DownloadServiceCallbacks { * * @return A non-null PendingIntent for the notification. */ - public PendingIntent getAuthentificationNotificationContentIntent(Context context, DownloadRequest request); + PendingIntent getAuthentificationNotificationContentIntent(Context context, DownloadRequest request); /** * Returns a PendingIntent for notification that notifies the user about the completion of downloads @@ -40,19 +40,19 @@ public interface DownloadServiceCallbacks { * * @return A non-null PendingIntent for the notification or null if shouldCreateReport()==false */ - public PendingIntent getReportNotificationContentIntent(Context context); + PendingIntent getReportNotificationContentIntent(Context context); /** * Called by the FeedSyncThread after a feed has been downloaded and parsed. * * @param feed The non-null feed that has been parsed. */ - public void onFeedParsed(Context context, Feed feed); + void onFeedParsed(Context context, Feed feed); /** * Returns true if the DownloadService should create a report that shows the number of failed * downloads when the service shuts down. * */ - public boolean shouldCreateReport(); + boolean shouldCreateReport(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java index cee1029d8..5fa6faa13 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java @@ -15,7 +15,7 @@ public interface FlattrCallbacks { * Returns if true if the flattr integration should be activated, * false otherwise. */ - public boolean flattrEnabled(); + boolean flattrEnabled(); /** * Returns an intent that starts the activity that is responsible for @@ -24,13 +24,13 @@ public interface FlattrCallbacks { * @return The intent that starts the authentication activity or null * if flattr integration is disabled (i.e. flattrEnabled() == false). */ - public Intent getFlattrAuthenticationActivityIntent(Context context); + Intent getFlattrAuthenticationActivityIntent(Context context); - public PendingIntent getFlattrFailedNotificationContentIntent(Context context); + PendingIntent getFlattrFailedNotificationContentIntent(Context context); - public String getFlattrAppKey(); + String getFlattrAppKey(); - public String getFlattrAppSecret(); + String getFlattrAppSecret(); - public void handleFlattrAuthenticationSuccess(AccessToken token); + void handleFlattrAuthenticationSuccess(AccessToken token); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java index 6174bce29..10797ecfb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java @@ -13,7 +13,7 @@ public interface GpodnetCallbacks { * Returns if true if the gpodder.net integration should be activated, * false otherwise. */ - public boolean gpodnetEnabled(); + boolean gpodnetEnabled(); /** * Returns a PendingIntent for the error notification of the GpodnetSyncService. @@ -23,5 +23,5 @@ public interface GpodnetCallbacks { * @return A PendingIntent for the notification or null if gpodder.net integration * has been disabled (i.e. gpodnetEnabled() == false). */ - public PendingIntent getGpodnetSyncServiceErrorNotificationPendingIntent(Context context); + PendingIntent getGpodnetSyncServiceErrorNotificationPendingIntent(Context context); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java index fb01fa703..08ccb6d71 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java @@ -17,17 +17,17 @@ public interface PlaybackServiceCallbacks { * @param mediaType The type of media that is being played. * @return A non-null activity intent. */ - public Intent getPlayerActivityIntent(Context context, MediaType mediaType); + Intent getPlayerActivityIntent(Context context, MediaType mediaType); /** * Returns true if the PlaybackService should load new episodes from the queue when playback ends * and false if the PlaybackService should ignore the queue and load no more episodes when playback * finishes. */ - public boolean useQueue(); + boolean useQueue(); /** * Returns a drawable resource that is used for the notification of the playback service. */ - public int getNotificationIconResource(Context context); + int getNotificationIconResource(Context context); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java index 7ff622f34..e475e696c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java +++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java @@ -30,9 +30,7 @@ public class FeedRemover extends AsyncTask { protected Void doInBackground(Void... params) { try { DBWriter.deleteFeed(context, feed.getId()).get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return null; diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java index c0ec8d08a..3ddaba52e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java +++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java @@ -45,7 +45,7 @@ public class FlattrClickWorker extends AsyncTask dbFutures = new LinkedList(); + List dbFutures = new LinkedList<>(); for (FlattrThing thing : flattrQueue) { if (BuildConfig.DEBUG) Log.d(TAG, "Processing " + thing.getTitle()); @@ -134,9 +134,7 @@ public class FlattrClickWorker extends AsyncTask * For example implementations, see FeedMedia or ExternalMedia. */ - public static final String SCHEME_MEDIA = "media"; + String SCHEME_MEDIA = "media"; /** * Parameter key for an encoded fallback Uri. This Uri MUST point to a local image file */ - public static final String PARAM_FALLBACK = "fallback"; + String PARAM_FALLBACK = "fallback"; /** * Returns a Uri to the image or null if no image is available. @@ -33,5 +33,5 @@ public interface ImageResource { * The Uri can also have an optional fallback-URL if loading the default URL * failed (see PARAM_FALLBACK). */ - public Uri getImageUri(); + Uri getImageUri(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java b/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java index 690fbdfc6..982015314 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java @@ -8,7 +8,6 @@ import android.content.Context; import android.os.ParcelFileDescriptor; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; import org.xmlpull.v1.XmlPullParserException; import java.io.ByteArrayOutputStream; @@ -26,8 +25,8 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; +import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.opml.OpmlElement; import de.danoeh.antennapod.core.opml.OpmlReader; @@ -45,13 +44,13 @@ public class OpmlBackupAgent extends BackupAgentHelper { addHelper(OPML_BACKUP_KEY, new OpmlBackupHelper(this)); } - private static final void LOGD(String tag, String msg) { + private static void LOGD(String tag, String msg) { if (BuildConfig.DEBUG && Log.isLoggable(tag, Log.DEBUG)) { Log.d(tag, msg); } } - private static final void LOGD(String tag, String msg, Throwable tr) { + private static void LOGD(String tag, String msg, Throwable tr) { if (BuildConfig.DEBUG && Log.isLoggable(tag, Log.DEBUG)) { Log.d(tag, msg, tr); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java b/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java index abb75e5e7..266526d82 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java +++ b/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java @@ -49,28 +49,10 @@ public abstract class ConfirmationDialog { builder.setTitle(titleId); builder.setMessage(messageId); builder.setPositiveButton(positiveText != 0 ? positiveText : R.string.confirm_label, - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - onConfirmButtonPressed(dialog); - } - }); + (dialog, which) -> onConfirmButtonPressed(dialog)); builder.setNegativeButton(negativeText != 0 ? negativeText : R.string.cancel_label, - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - onCancelButtonPressed(dialog); - } - }); - builder.setOnCancelListener(new DialogInterface.OnCancelListener() { - - @Override - public void onCancel(DialogInterface dialog) { - onCancelButtonPressed(dialog); - } - }); + (dialog, which) -> onCancelButtonPressed(dialog)); + builder.setOnCancelListener(ConfirmationDialog.this::onCancelButtonPressed); return builder.create(); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java b/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java index b7e79431d..b1beac315 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java @@ -1,7 +1,6 @@ package de.danoeh.antennapod.core.dialog; import android.content.Context; -import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import de.danoeh.antennapod.core.R; @@ -15,13 +14,7 @@ public class DownloadRequestErrorDialogCreator { String errorMessage) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setNeutralButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }) + (dialog, which) -> dialog.dismiss()) .setTitle(R.string.download_error_request_error) .setMessage( context.getString(R.string.download_request_error_dialog_message_prefix) diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java index 7ccb742fb..dbad084c7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java @@ -34,7 +34,7 @@ public class EventDistributor extends Observable { private EventDistributor() { this.handler = new Handler(); - events = new ConcurrentLinkedQueue(); + events = new ConcurrentLinkedQueue<>(); } public static synchronized EventDistributor getInstance() { @@ -54,13 +54,7 @@ public class EventDistributor extends Observable { public void addEvent(Integer i) { events.offer(i); - handler.post(new Runnable() { - - @Override - public void run() { - processEventQueue(); - } - }); + handler.post(EventDistributor.this::processEventQueue); } private void processEventQueue() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java index dfcc71658..67ac2d280 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java @@ -112,7 +112,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { this.flattrStatus = status; this.paged = paged; this.nextPageLink = nextPageLink; - this.items = new ArrayList(); + this.items = new ArrayList<>(); if(filter != null) { this.itemfilter = new FeedItemFilter(filter); } else { @@ -235,7 +235,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { */ public boolean hasUnplayedItems() { for (FeedItem item : items) { - if (false == item.isNew() && false == item.isPlayed()) { + if (!item.isNew() && !item.isPlayed()) { return true; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java index 05115c1ea..90b5e50b7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java @@ -54,9 +54,8 @@ public abstract class FeedComponent { FeedComponent that = (FeedComponent) o; - if (id != that.id) return false; + return id == that.id; - return true; } @Override 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 d8c32f55e..b2192c66f 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 @@ -171,9 +171,8 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr String itemIdentifier = cursor.getString(indexItemIdentifier); long autoDownload = cursor.getLong(indexAutoDownload); - FeedItem item = new FeedItem(id, title, link, pubDate, paymentLink, feedId, flattrStatus, + return new FeedItem(id, title, link, pubDate, paymentLink, feedId, flattrStatus, hasChapters, null, state, itemIdentifier, autoDownload); - return item; } public void updateFromOther(FeedItem other) { @@ -359,24 +358,16 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr } private boolean isPlaying() { - if (media != null) { - return media.isPlaying(); - } - return false; + return media != null && media.isPlaying(); } @Override public Callable loadShownotes() { - return new Callable() { - @Override - public String call() throws Exception { - - if (contentEncoded == null || description == null) { - DBReader.loadExtraInformationOfFeedItem(FeedItem.this); - - } - return (contentEncoded != null) ? contentEncoded : description; + return () -> { + if (contentEncoded == null || description == null) { + DBReader.loadExtraInformationOfFeedItem(FeedItem.this); } + return (contentEncoded != null) ? contentEncoded : description; }; } 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 6b11e162e..8a04e65ec 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 @@ -499,20 +499,17 @@ public class FeedMedia extends FeedFile implements Playable { @Override public Callable loadShownotes() { - return new Callable() { - @Override - public String call() throws Exception { - if (item == null) { - item = DBReader.getFeedItem( - itemID); - } - if (item.getContentEncoded() == null || item.getDescription() == null) { - DBReader.loadExtraInformationOfFeedItem( - item); + return () -> { + if (item == null) { + item = DBReader.getFeedItem( + itemID); + } + if (item.getContentEncoded() == null || item.getDescription() == null) { + DBReader.loadExtraInformationOfFeedItem( + item); - } - return (item.getContentEncoded() != null) ? item.getContentEncoded() : item.getDescription(); } + return (item.getContentEncoded() != null) ? item.getContentEncoded() : item.getDescription(); }; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java index 019001da7..e2b5dd7c2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java @@ -68,7 +68,7 @@ public class FeedPreferences { /** * @return the filter for this feed */ - public FeedFilter getFilter() { + public @NonNull FeedFilter getFilter() { return filter; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java index 86baa459c..5c09a2302 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; -import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; import de.danoeh.antennapod.core.service.download.HttpDownloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -107,7 +106,7 @@ public class ApOkHttpUrlLoader implements ModelLoader { public Response intercept(Chain chain) throws IOException { com.squareup.okhttp.Request request = chain.request(); String url = request.urlString(); - Context context = ClientConfig.applicationCallbacks.getApplicationInstance(); + // Context context = ClientConfig.applicationCallbacks.getApplicationInstance(); String authentication = DBReader.getImageAuthentication(url); if(TextUtils.isEmpty(authentication)) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java index 48f234917..9f716e546 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java @@ -80,7 +80,7 @@ public class GpodnetService { String response = executeRequest(request); try { JSONArray jsonTagList = new JSONArray(response); - List tagList = new ArrayList( + List tagList = new ArrayList<>( jsonTagList.length()); for (int i = 0; i < jsonTagList.length(); i++) { JSONObject jObj = jsonTagList.getJSONObject(i); @@ -318,8 +318,7 @@ public class GpodnetService { URL url = new URI(BASE_SCHEME, BASE_HOST, String.format( "/subscriptions/%s.opml", username), null).toURL(); Request.Builder request = new Request.Builder().url(url); - String response = executeRequest(request); - return response; + return executeRequest(request); } catch (MalformedURLException | URISyntaxException e) { e.printStackTrace(); throw new GpodnetServiceException(e); @@ -660,7 +659,7 @@ public class GpodnetService { private List readPodcastListFromJSONArray(@NonNull JSONArray array) throws JSONException { - List result = new ArrayList( + List result = new ArrayList<>( array.length()); for (int i = 0; i < array.length(); i++) { result.add(readPodcastFromJSONObject(array.getJSONObject(i))); @@ -712,7 +711,7 @@ public class GpodnetService { private List readDeviceListFromJSONArray(@NonNull JSONArray array) throws JSONException { - List result = new ArrayList( + List result = new ArrayList<>( array.length()); for (int i = 0; i < array.length(); i++) { result.add(readDeviceFromJSONObject(array.getJSONObject(i))); @@ -732,7 +731,7 @@ public class GpodnetService { private GpodnetSubscriptionChange readSubscriptionChangesFromJSONObject( @NonNull JSONObject object) throws JSONException { - List added = new LinkedList(); + List added = new LinkedList<>(); JSONArray jsonAdded = object.getJSONArray("add"); for (int i = 0; i < jsonAdded.length(); i++) { String addedUrl = jsonAdded.getString(i); @@ -741,7 +740,7 @@ public class GpodnetService { added.add(addedUrl); } - List removed = new LinkedList(); + List removed = new LinkedList<>(); JSONArray jsonRemoved = object.getJSONArray("remove"); for (int i = 0; i < jsonRemoved.length(); i++) { String removedUrl = jsonRemoved.getString(i); @@ -757,7 +756,7 @@ public class GpodnetService { private GpodnetEpisodeActionGetResponse readEpisodeActionsFromJSONObject( @NonNull JSONObject object) throws JSONException { - List episodeActions = new ArrayList(); + List episodeActions = new ArrayList<>(); long timestamp = object.getLong("timestamp"); JSONArray jsonActions = object.getJSONArray("actions"); diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java index 2d49c170a..79eb33cb5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java +++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java @@ -25,7 +25,7 @@ public class GpodnetDevice { + type + ", subscriptions=" + subscriptions + "]"; } - public static enum DeviceType { + public enum DeviceType { DESKTOP, LAPTOP, MOBILE, SERVER, OTHER; static DeviceType fromString(String s) { @@ -33,16 +33,17 @@ public class GpodnetDevice { return OTHER; } - if (s.equals("desktop")) { - return DESKTOP; - } else if (s.equals("laptop")) { - return LAPTOP; - } else if (s.equals("mobile")) { - return MOBILE; - } else if (s.equals("server")) { - return SERVER; - } else { - return OTHER; + switch (s) { + case "desktop": + return DESKTOP; + case "laptop": + return LAPTOP; + case "mobile": + return MOBILE; + case "server": + return SERVER; + default: + return OTHER; } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java index 01c888d6b..9627ecae6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java +++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java @@ -61,14 +61,13 @@ public class GpodnetEpisodeAction { String deviceId = fields[2]; try { Action action = Action.valueOf(fields[3]); - GpodnetEpisodeAction result = new Builder(podcast, episode, action) + return new Builder(podcast, episode, action) .deviceId(deviceId) .timestamp(new Date(Long.parseLong(fields[4]))) .started(Integer.parseInt(fields[5])) .position(Integer.parseInt(fields[6])) .total(Integer.parseInt(fields[7])) .build(); - return result; } catch(IllegalArgumentException e) { Log.e(TAG, "readFromString(" + s + "): " + e.getMessage()); return null; diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java index 5f096db14..03c33c9a1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java +++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java @@ -38,7 +38,7 @@ public class GpodnetEpisodeActionPostResponse { final JSONObject object = new JSONObject(objectString); final long timestamp = object.getLong("timestamp"); JSONArray urls = object.getJSONArray("update_urls"); - Map updatedUrls = new ArrayMap(urls.length()); + Map updatedUrls = new ArrayMap<>(urls.length()); for (int i = 0; i < urls.length(); i++) { JSONArray urlPair = urls.getJSONArray(i); updatedUrls.put(urlPair.getString(0), urlPair.getString(1)); diff --git a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java index b8d17bcce..f63c9aeb0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java @@ -32,7 +32,7 @@ public class MenuItemUtils { } } - public static interface UpdateRefreshMenuItemChecker { - public boolean isRefreshing(); + public interface UpdateRefreshMenuItemChecker { + boolean isRefreshing(); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java b/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java index 775129d09..17afc7904 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java @@ -1,7 +1,7 @@ package de.danoeh.antennapod.core.opml; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; @@ -10,6 +10,8 @@ import java.io.IOException; import java.io.Reader; import java.util.ArrayList; +import de.danoeh.antennapod.core.BuildConfig; + /** Reads OPML documents. */ public class OpmlReader { private static final String TAG = "OpmlReader"; @@ -27,7 +29,7 @@ public class OpmlReader { */ public ArrayList readDocument(Reader reader) throws XmlPullParserException, IOException { - elementList = new ArrayList(); + elementList = new ArrayList<>(); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java index edd7b807a..6d4d3baa6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java @@ -189,7 +189,7 @@ public class GpodnetPreferences { public static Set getAddedFeedsCopy() { ensurePreferencesLoaded(); - Set copy = new HashSet(); + Set copy = new HashSet<>(); feedListLock.lock(); copy.addAll(addedFeeds); feedListLock.unlock(); @@ -206,7 +206,7 @@ public class GpodnetPreferences { public static Set getRemovedFeedsCopy() { ensurePreferencesLoaded(); - Set copy = new HashSet(); + Set copy = new HashSet<>(); feedListLock.lock(); copy.addAll(removedFeeds); feedListLock.unlock(); @@ -232,7 +232,7 @@ public class GpodnetPreferences { public static List getQueuedEpisodeActions() { ensurePreferencesLoaded(); - List copy = new ArrayList(); + List copy = new ArrayList<>(); feedListLock.lock(); copy.addAll(queuedEpisodeActions); feedListLock.unlock(); @@ -272,7 +272,7 @@ public class GpodnetPreferences { } private static Set readListFromString(String s) { - Set result = new HashSet(); + Set result = new HashSet<>(); for (String item : s.split(" ")) { result.add(item); } @@ -290,7 +290,7 @@ public class GpodnetPreferences { private static List readEpisodeActionsFromString(String s) { String[] lines = s.split("\n"); - List result = new ArrayList(lines.length); + List result = new ArrayList<>(lines.length); for(String line : lines) { if(TextUtils.isEmpty(line)) { GpodnetEpisodeAction action = GpodnetEpisodeAction.readFromString(line); diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index f9613cc3d..2541a27aa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -292,7 +292,7 @@ public class UserPreferences { public static long getUpdateInterval() { String updateInterval = prefs.getString(PREF_UPDATE_INTERVAL, "0"); - if(false == updateInterval.contains(":")) { + if(!updateInterval.contains(":")) { return readUpdateInterval(updateInterval); } else { return 0; @@ -411,8 +411,7 @@ public class UserPreferences { int port = prefs.getInt(PREF_PROXY_PORT, 0); String username = prefs.getString(PREF_PROXY_USER, null); String password = prefs.getString(PREF_PROXY_PASSWORD, null); - ProxyConfig config = new ProxyConfig(type, host, port, username, password); - return config; + return new ProxyConfig(type, host, port, username, password); } public static boolean shouldResumeAfterCall() { 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 be6cd88cb..3f0112b56 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 @@ -41,11 +41,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingDeque; -import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -252,54 +249,35 @@ public class DownloadService extends Service { Log.d(TAG, "Service started"); isRunning = true; handler = new Handler(); - reportQueue = Collections.synchronizedList(new ArrayList()); - downloads = Collections.synchronizedList(new ArrayList()); + reportQueue = Collections.synchronizedList(new ArrayList<>()); + downloads = Collections.synchronizedList(new ArrayList<>()); numberOfDownloads = new AtomicInteger(0); IntentFilter cancelDownloadReceiverFilter = new IntentFilter(); cancelDownloadReceiverFilter.addAction(ACTION_CANCEL_ALL_DOWNLOADS); cancelDownloadReceiverFilter.addAction(ACTION_CANCEL_DOWNLOAD); registerReceiver(cancelDownloadReceiver, cancelDownloadReceiverFilter); - syncExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } + syncExecutor = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; }); Log.d(TAG, "parallel downloads: " + UserPreferences.getParallelDownloads()); - downloadExecutor = new ExecutorCompletionService( + downloadExecutor = new ExecutorCompletionService<>( Executors.newFixedThreadPool(UserPreferences.getParallelDownloads(), - new ThreadFactory() { - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } + r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; } ) ); schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE, - new ThreadFactory() { - - @Override - public Thread newThread(Runnable 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, "SchedEx rejected submission of new task"); - } - } + r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; + }, (r, executor) -> Log.w(TAG, "SchedEx rejected submission of new task") ); downloadCompletionThread.start(); feedSyncThread = new FeedSyncThread(); @@ -383,16 +361,16 @@ public class DownloadService extends Service { if (i > 0) { bigText.append("\n"); } - bigText.append("\u2022 " + request.getTitle()); + bigText.append("\u2022 ").append(request.getTitle()); } } else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { if (request.getTitle() != null) { if (i > 0) { bigText.append("\n"); } - bigText.append("\u2022 " + request.getTitle() - + " (" + request.getProgressPercent() - + "%)"); + bigText.append("\u2022 ").append(request.getTitle()) + .append(" (").append(request.getProgressPercent()) + .append("%)"); } } @@ -489,16 +467,13 @@ public class DownloadService extends Service { * DownloadService list. */ private void removeDownload(final Downloader d) { - handler.post(new Runnable() { - @Override - public void run() { - Log.d(TAG, "Removing downloader: " - + d.getDownloadRequest().getSource()); - boolean rc = downloads.remove(d); - Log.d(TAG, "Result of downloads.remove: " + rc); - DownloadRequester.getInstance().removeDownload(d.getDownloadRequest()); - postDownloaders(); - } + handler.post(() -> { + Log.d(TAG, "Removing downloader: " + + d.getDownloadRequest().getSource()); + boolean rc = downloads.remove(d); + Log.d(TAG, "Result of downloads.remove: " + rc); + DownloadRequester.getInstance().removeDownload(d.getDownloadRequest()); + postDownloaders(); }); } @@ -574,12 +549,7 @@ public class DownloadService extends Service { * used from a thread other than the main thread. */ void queryDownloadsAsync() { - handler.post(new Runnable() { - public void run() { - queryDownloads(); - ; - } - }); + handler.post(DownloadService.this::queryDownloads); } /** @@ -598,27 +568,24 @@ public class DownloadService extends Service { } private void postAuthenticationNotification(final DownloadRequest downloadRequest) { - handler.post(new Runnable() { - @Override - public void run() { - final String resourceTitle = (downloadRequest.getTitle() != null) - ? downloadRequest.getTitle() : downloadRequest.getSource(); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(DownloadService.this); - builder.setTicker(getText(R.string.authentication_notification_title)) - .setContentTitle(getText(R.string.authentication_notification_title)) - .setContentText(getText(R.string.authentication_notification_msg)) - .setStyle(new NotificationCompat.BigTextStyle().bigText(getText(R.string.authentication_notification_msg) - + ": " + resourceTitle)) - .setSmallIcon(R.drawable.ic_stat_authentication) - .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_stat_authentication)) - .setAutoCancel(true) - .setContentIntent(ClientConfig.downloadServiceCallbacks.getAuthentificationNotificationContentIntent(DownloadService.this, downloadRequest)) - .setVisibility(Notification.VISIBILITY_PUBLIC); - Notification n = builder.build(); - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(downloadRequest.getSource().hashCode(), n); - } + handler.post(() -> { + final String resourceTitle = (downloadRequest.getTitle() != null) + ? downloadRequest.getTitle() : downloadRequest.getSource(); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(DownloadService.this); + builder.setTicker(getText(R.string.authentication_notification_title)) + .setContentTitle(getText(R.string.authentication_notification_title)) + .setContentText(getText(R.string.authentication_notification_msg)) + .setStyle(new NotificationCompat.BigTextStyle().bigText(getText(R.string.authentication_notification_msg) + + ": " + resourceTitle)) + .setSmallIcon(R.drawable.ic_stat_authentication) + .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_stat_authentication)) + .setAutoCancel(true) + .setContentIntent(ClientConfig.downloadServiceCallbacks.getAuthentificationNotificationContentIntent(DownloadService.this, downloadRequest)) + .setVisibility(Notification.VISIBILITY_PUBLIC); + Notification n = builder.build(); + NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + nm.notify(downloadRequest.getSource().hashCode(), n); }); } @@ -651,8 +618,8 @@ public class DownloadService extends Service { class FeedSyncThread extends Thread { private static final String TAG = "FeedSyncThread"; - private BlockingQueue completedRequests = new LinkedBlockingDeque(); - private CompletionService> parserService = new ExecutorCompletionService>(Executors.newSingleThreadExecutor()); + private BlockingQueue completedRequests = new LinkedBlockingDeque<>(); + private CompletionService> parserService = new ExecutorCompletionService<>(Executors.newSingleThreadExecutor()); private ExecutorService dbService = Executors.newSingleThreadExecutor(); private Future dbUpdateFuture; private volatile boolean isActive = true; @@ -668,7 +635,7 @@ public class DownloadService extends Service { * @return Collected feeds or null if the method has been interrupted during the first waiting period. */ private List> collectCompletedRequests() { - List> results = new LinkedList>(); + List> results = new LinkedList<>(); DownloadRequester requester = DownloadRequester.getInstance(); int tasks = 0; @@ -712,11 +679,9 @@ public class DownloadService extends Service { if (result != null) { results.add(result); } - } catch (InterruptedException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); } } @@ -751,41 +716,36 @@ public class DownloadService extends Service { if (dbUpdateFuture != null) { try { dbUpdateFuture.get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } - dbUpdateFuture = dbService.submit(new Runnable() { - @Override - public void run() { - Feed[] savedFeeds = DBTasks.updateFeed(DownloadService.this, getFeeds(results)); - - for (int i = 0; i < savedFeeds.length; i++) { - Feed savedFeed = savedFeeds[i]; - - // If loadAllPages=true, check if another page is available and queue it for download - final boolean loadAllPages = results.get(i).first.getArguments().getBoolean(DownloadRequester.REQUEST_ARG_LOAD_ALL_PAGES); - final Feed feed = results.get(i).second.feed; - if (loadAllPages && feed.getNextPageLink() != null) { - try { - feed.setId(savedFeed.getId()); - DBTasks.loadNextPageOfFeed(DownloadService.this, savedFeed, true); - } catch (DownloadRequestException e) { - Log.e(TAG, "Error trying to load next page", e); - } + dbUpdateFuture = dbService.submit(() -> { + Feed[] savedFeeds = DBTasks.updateFeed(DownloadService.this, getFeeds(results)); + + for (int i = 0; i < savedFeeds.length; i++) { + Feed savedFeed = savedFeeds[i]; + + // If loadAllPages=true, check if another page is available and queue it for download + final boolean loadAllPages = results.get(i).first.getArguments().getBoolean(DownloadRequester.REQUEST_ARG_LOAD_ALL_PAGES); + final Feed feed = results.get(i).second.feed; + if (loadAllPages && feed.getNextPageLink() != null) { + try { + feed.setId(savedFeed.getId()); + DBTasks.loadNextPageOfFeed(DownloadService.this, savedFeed, true); + } catch (DownloadRequestException e) { + Log.e(TAG, "Error trying to load next page", e); } - - ClientConfig.downloadServiceCallbacks.onFeedParsed(DownloadService.this, - savedFeed); - - numberOfDownloads.decrementAndGet(); } - queryDownloadsAsync(); + ClientConfig.downloadServiceCallbacks.onFeedParsed(DownloadService.this, + savedFeed); + + numberOfDownloads.decrementAndGet(); } + + queryDownloadsAsync(); }); } @@ -847,21 +807,11 @@ public class DownloadService extends Service { try { result = feedHandler.parseFeed(feed); Log.d(TAG, feed.getTitle() + " parsed"); - if (checkFeedData(feed) == false) { + if (!checkFeedData(feed)) { throw new InvalidFeedException(); } - } catch (SAXException e) { - successful = false; - e.printStackTrace(); - reason = DownloadError.ERROR_PARSER_EXCEPTION; - reasonDetailed = e.getMessage(); - } catch (IOException e) { - successful = false; - e.printStackTrace(); - reason = DownloadError.ERROR_PARSER_EXCEPTION; - reasonDetailed = e.getMessage(); - } catch (ParserConfigurationException e) { + } catch (SAXException | IOException | ParserConfigurationException e) { successful = false; e.printStackTrace(); reason = DownloadError.ERROR_PARSER_EXCEPTION; @@ -884,7 +834,7 @@ public class DownloadService extends Service { if (successful) { // we create a 'successful' download log if the feed's last refresh failed List log = DBReader.getFeedDownloadLog(feed); - if(log.size() > 0 && log.get(0).isSuccessful() == false) { + if(log.size() > 0 && !log.get(0).isSuccessful()) { saveDownloadStatus(new DownloadStatus(feed, feed.getHumanReadableIdentifier(), DownloadError.SUCCESS, successful, reasonDetailed)); @@ -1017,9 +967,7 @@ public class DownloadService extends Service { media.setFile_url(request.getDestination()); try { DBWriter.setFeedMedia(media).get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } @@ -1087,10 +1035,7 @@ public class DownloadService extends Service { if (item != null && !DBTasks.isInQueue(DownloadService.this, item.getId())) { DBWriter.addQueueItem(DownloadService.this, item).get(); } - } catch (ExecutionException e) { - e.printStackTrace(); - status = new DownloadStatus(media, media.getEpisodeTitle(), DownloadError.ERROR_DB_ACCESS_ERROR, false, e.getMessage()); - } catch (InterruptedException e) { + } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); status = new DownloadStatus(media, media.getEpisodeTitle(), DownloadError.ERROR_DB_ACCESS_ERROR, false, e.getMessage()); } @@ -1134,14 +1079,11 @@ public class DownloadService extends Service { private class NotificationUpdater implements Runnable { public void run() { - handler.post(new Runnable() { - @Override - public void run() { - Notification n = updateNotifications(); - if (n != null) { - NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(NOTIFICATION_ID, n); - } + handler.post(() -> { + Notification n = updateNotifications(); + if (n != null) { + NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + nm.notify(NOTIFICATION_ID, n); } }); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java index 2d9347b0a..b0829f084 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java @@ -6,5 +6,5 @@ package de.danoeh.antennapod.core.service.download; */ public interface DownloaderCallback { - public void onDownloadCompleted(Downloader downloader); + void onDownloadCompleted(Downloader downloader); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java index 2b26f58c0..f79cf9685 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java @@ -21,7 +21,7 @@ import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.net.URI; import java.net.UnknownHostException; -import java.util.Arrays; +import java.util.Collections; import java.util.Date; import de.danoeh.antennapod.core.ClientConfig; @@ -84,9 +84,8 @@ public class HttpDownloader extends Downloader { httpReq.addHeader("If-Modified-Since", lastModified); } } else { - String eTag = lastModified; - Log.d(TAG, "addHeader(\"If-None-Match\", \"" + eTag + "\")"); - httpReq.addHeader("If-None-Match", eTag); + Log.d(TAG, "addHeader(\"If-None-Match\", \"" + lastModified + "\")"); + httpReq.addHeader("If-None-Match", lastModified); } } @@ -111,13 +110,13 @@ public class HttpDownloader extends Downloader { Log.d(TAG, "Adding range header: " + request.getSoFar()); } - Response response = null; + Response response; try { response = httpClient.newCall(httpReq.build()).execute(); } catch(IOException e) { Log.e(TAG, e.toString()); if(e.getMessage().contains("PROTOCOL_ERROR")) { - httpClient.setProtocols(Arrays.asList(Protocol.HTTP_1_1)); + httpClient.setProtocols(Collections.singletonList(Protocol.HTTP_1_1)); response = httpClient.newCall(httpReq.build()).execute(); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java index e886932f2..6eb1f4118 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java @@ -8,7 +8,7 @@ public class ProxyConfig { public final Proxy.Type type; @Nullable public final String host; - @Nullable public final int port; + public final int port; @Nullable public final String username; @Nullable public final String password; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 2be075a92..9ca05d1f7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -835,7 +835,7 @@ public class PlaybackService extends Service { if (!Thread.currentThread().isInterrupted() && started && info.playable != null) { String contentText = info.playable.getEpisodeTitle(); String contentTitle = info.playable.getFeedTitle(); - Notification notification = null; + Notification notification; // Builder is v7, even if some not overwritten methods return its parent's v4 interface NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder( diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index 775820d7d..ecec10871 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -99,7 +99,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); this.playerLock = new ReentrantLock(); this.startWhenPrepared = new AtomicBoolean(false); - executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.MINUTES, new LinkedBlockingDeque(), + executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<>(), new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { @@ -175,18 +175,15 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre */ public void playMediaObject(@NonNull final Playable playable, final boolean stream, final boolean startWhenPrepared, final boolean prepareImmediately) { Log.d(TAG, "playMediaObject(...)"); - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - try { - playMediaObject(playable, false, stream, startWhenPrepared, prepareImmediately); - } catch (RuntimeException e) { - e.printStackTrace(); - throw e; - } finally { - playerLock.unlock(); - } + executor.submit(() -> { + playerLock.lock(); + try { + playMediaObject(playable, false, stream, startWhenPrepared, prepareImmediately); + } catch (RuntimeException e) { + e.printStackTrace(); + throw e; + } finally { + playerLock.unlock(); } }); } @@ -258,10 +255,10 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } setPlayerStatus(PlayerStatus.INITIALIZED, media); - if (mediaType == MediaType.VIDEO) { - VideoPlayer vp = (VideoPlayer) mediaPlayer; - // vp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT); - } +// if (mediaType == MediaType.VIDEO) { +// VideoPlayer vp = (VideoPlayer) mediaPlayer; +// // vp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT); +// } if (prepareImmediately) { setPlayerStatus(PlayerStatus.PREPARING, media); @@ -269,13 +266,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre onPrepared(startWhenPrepared); } - } catch (Playable.PlayableException e) { - e.printStackTrace(); - setPlayerStatus(PlayerStatus.ERROR, null); - } catch (IOException e) { - e.printStackTrace(); - setPlayerStatus(PlayerStatus.ERROR, null); - } catch (IllegalStateException e) { + } catch (Playable.PlayableException | IOException | IllegalStateException e) { e.printStackTrace(); setPlayerStatus(PlayerStatus.ERROR, null); } @@ -379,29 +370,26 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * file is being streamed */ public void pause(final boolean abandonFocus, final boolean reinit) { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - releaseWifiLockIfNecessary(); - if (playerStatus == PlayerStatus.PLAYING) { - Log.d(TAG, "Pausing playback."); - mediaPlayer.pause(); - setPlayerStatus(PlayerStatus.PAUSED, media); + executor.submit(() -> { + playerLock.lock(); + releaseWifiLockIfNecessary(); + if (playerStatus == PlayerStatus.PLAYING) { + Log.d(TAG, "Pausing playback."); + mediaPlayer.pause(); + setPlayerStatus(PlayerStatus.PAUSED, media); - if (abandonFocus) { - audioManager.abandonAudioFocus(audioFocusChangeListener); - pausedBecauseOfTransientAudiofocusLoss = false; - } - if (stream && reinit) { - reinit(); - } - } else { - Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state"); + if (abandonFocus) { + audioManager.abandonAudioFocus(audioFocusChangeListener); + pausedBecauseOfTransientAudiofocusLoss = false; } - - playerLock.unlock(); + if (stream && reinit) { + reinit(); + } + } else { + Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state"); } + + playerLock.unlock(); }); } @@ -412,25 +400,22 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * This method is executed on an internal executor service. */ public void prepare() { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - - if (playerStatus == PlayerStatus.INITIALIZED) { - Log.d(TAG, "Preparing media player"); - setPlayerStatus(PlayerStatus.PREPARING, media); - try { - mediaPlayer.prepare(); - onPrepared(startWhenPrepared.get()); - } catch (IOException e) { - e.printStackTrace(); - setPlayerStatus(PlayerStatus.ERROR, null); - } - } - playerLock.unlock(); + executor.submit(() -> { + playerLock.lock(); + if (playerStatus == PlayerStatus.INITIALIZED) { + Log.d(TAG, "Preparing media player"); + setPlayerStatus(PlayerStatus.PREPARING, media); + try { + mediaPlayer.prepare(); + onPrepared(startWhenPrepared.get()); + } catch (IOException e) { + e.printStackTrace(); + setPlayerStatus(PlayerStatus.ERROR, null); + } } + playerLock.unlock(); + }); } @@ -449,7 +434,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre if (mediaType == MediaType.VIDEO) { VideoPlayer vp = (VideoPlayer) mediaPlayer; - videoSize = new Pair(vp.getVideoWidth(), vp.getVideoHeight()); + videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); } if (media.getPosition() > 0) { @@ -475,20 +460,17 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * This method is executed on an internal executor service. */ public void reinit() { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - releaseWifiLockIfNecessary(); - if (media != null) { - playMediaObject(media, true, stream, startWhenPrepared.get(), false); - } else if (mediaPlayer != null) { - mediaPlayer.reset(); - } else { - Log.d(TAG, "Call to reinit was ignored: media and mediaPlayer were null"); - } - playerLock.unlock(); + executor.submit(() -> { + playerLock.lock(); + releaseWifiLockIfNecessary(); + if (media != null) { + playMediaObject(media, true, stream, startWhenPrepared.get(), false); + } else if (mediaPlayer != null) { + mediaPlayer.reset(); + } else { + Log.d(TAG, "Call to reinit was ignored: media and mediaPlayer were null"); } + playerLock.unlock(); }); } @@ -542,12 +524,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * This method is executed on an internal executor service. */ public void seekTo(final int t) { - executor.submit(new Runnable() { - @Override - public void run() { - seekToSync(t); - } - }); + executor.submit(() -> seekToSync(t)); } /** @@ -556,19 +533,16 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * @param d offset from current position (positive or negative) */ public void seekDelta(final int d) { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - int currentPosition = getPosition(); - if (currentPosition != INVALID_TIME) { - seekToSync(currentPosition + d); - } else { - Log.e(TAG, "getPosition() returned INVALID_TIME in seekDelta"); - } - - playerLock.unlock(); + executor.submit(() -> { + playerLock.lock(); + int currentPosition = getPosition(); + if (currentPosition != INVALID_TIME) { + seekToSync(currentPosition + d); + } else { + Log.e(TAG, "getPosition() returned INVALID_TIME in seekDelta"); } + + playerLock.unlock(); }); } @@ -657,7 +631,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre playerLock.lock(); if (media != null && media.getMediaType() == MediaType.AUDIO) { if (mediaPlayer.canSetSpeed()) { - mediaPlayer.setPlaybackSpeed((float) speed); + mediaPlayer.setPlaybackSpeed(speed); Log.d(TAG, "Playback speed was set to " + speed); callback.playbackSpeedChanged(speed); } @@ -670,12 +644,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * This method is executed on an internal executor service. */ public void setSpeed(final float speed) { - executor.submit(new Runnable() { - @Override - public void run() { - setSpeedSync(speed); - } - }); + executor.submit(() -> setSpeedSync(speed)); } /** @@ -761,28 +730,22 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } public void setVideoSurface(final SurfaceHolder surface) { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - if (mediaPlayer != null) { - mediaPlayer.setDisplay(surface); - } - playerLock.unlock(); + executor.submit(() -> { + playerLock.lock(); + if (mediaPlayer != null) { + mediaPlayer.setDisplay(surface); } + playerLock.unlock(); }); } public void resetVideoSurface() { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - Log.d(TAG, "Resetting video surface"); - mediaPlayer.setDisplay(null); - reinit(); - playerLock.unlock(); - } + executor.submit(() -> { + playerLock.lock(); + Log.d(TAG, "Resetting video surface"); + mediaPlayer.setDisplay(null); + reinit(); + playerLock.unlock(); }); } @@ -803,7 +766,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre res = null; } else { VideoPlayer vp = (VideoPlayer) mediaPlayer; - videoSize = new Pair(vp.getVideoWidth(), vp.getVideoHeight()); + videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight()); res = videoSize; } playerLock.unlock(); @@ -1009,20 +972,17 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * abandoning audio focus have to be done with other methods. */ public void stop() { - executor.submit(new Runnable() { - @Override - public void run() { - playerLock.lock(); - releaseWifiLockIfNecessary(); - - if (playerStatus == PlayerStatus.INDETERMINATE) { - setPlayerStatus(PlayerStatus.STOPPED, null); - } else { - Log.d(TAG, "Ignored call to stop: Current player state is: " + playerStatus); - } - playerLock.unlock(); + executor.submit(() -> { + playerLock.lock(); + releaseWifiLockIfNecessary(); + if (playerStatus == PlayerStatus.INDETERMINATE) { + setPlayerStatus(PlayerStatus.STOPPED, null); + } else { + Log.d(TAG, "Ignored call to stop: Current player state is: " + playerStatus); } + playerLock.unlock(); + }); } @@ -1097,100 +1057,59 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return mp; } - private final org.antennapod.audio.MediaPlayer.OnCompletionListener audioCompletionListener = new org.antennapod.audio.MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(org.antennapod.audio.MediaPlayer mp) { - genericOnCompletion(); - } - }; + private final org.antennapod.audio.MediaPlayer.OnCompletionListener audioCompletionListener = + mp -> genericOnCompletion(); - private final android.media.MediaPlayer.OnCompletionListener videoCompletionListener = new android.media.MediaPlayer.OnCompletionListener() { - @Override - public void onCompletion(android.media.MediaPlayer mp) { - genericOnCompletion(); - } - }; + private final android.media.MediaPlayer.OnCompletionListener videoCompletionListener = + mp -> genericOnCompletion(); private void genericOnCompletion() { endPlayback(false); } - private final org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener = new org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener() { - @Override - public void onBufferingUpdate(org.antennapod.audio.MediaPlayer mp, - int percent) { - genericOnBufferingUpdate(percent); - } - }; + private final org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener = + (mp, percent) -> genericOnBufferingUpdate(percent); - private final android.media.MediaPlayer.OnBufferingUpdateListener videoBufferingUpdateListener = new android.media.MediaPlayer.OnBufferingUpdateListener() { - @Override - public void onBufferingUpdate(android.media.MediaPlayer mp, int percent) { - genericOnBufferingUpdate(percent); - } - }; + private final android.media.MediaPlayer.OnBufferingUpdateListener videoBufferingUpdateListener = + (mp, percent) -> genericOnBufferingUpdate(percent); private void genericOnBufferingUpdate(int percent) { callback.onBufferingUpdate(percent); } - private final org.antennapod.audio.MediaPlayer.OnInfoListener audioInfoListener = new org.antennapod.audio.MediaPlayer.OnInfoListener() { - @Override - public boolean onInfo(org.antennapod.audio.MediaPlayer mp, int what, - int extra) { - return genericInfoListener(what); - } - }; + private final org.antennapod.audio.MediaPlayer.OnInfoListener audioInfoListener = + (mp, what, extra) -> genericInfoListener(what); - private final android.media.MediaPlayer.OnInfoListener videoInfoListener = new android.media.MediaPlayer.OnInfoListener() { - @Override - public boolean onInfo(android.media.MediaPlayer mp, int what, int extra) { - return genericInfoListener(what); - } - }; + private final android.media.MediaPlayer.OnInfoListener videoInfoListener = + (mp, what, extra) -> genericInfoListener(what); private boolean genericInfoListener(int what) { return callback.onMediaPlayerInfo(what); } - private final org.antennapod.audio.MediaPlayer.OnErrorListener audioErrorListener = new org.antennapod.audio.MediaPlayer.OnErrorListener() { - @Override - public boolean onError(org.antennapod.audio.MediaPlayer mp, int what, int extra) { - if(mp.canFallback()) { - mp.fallback(); - return true; - } else { - return genericOnError(mp, what, extra); - } - } - }; + private final org.antennapod.audio.MediaPlayer.OnErrorListener audioErrorListener = + (mp, what, extra) -> { + if(mp.canFallback()) { + mp.fallback(); + return true; + } else { + return genericOnError(mp, what, extra); + } + }; - private final android.media.MediaPlayer.OnErrorListener videoErrorListener = new android.media.MediaPlayer.OnErrorListener() { - @Override - public boolean onError(android.media.MediaPlayer mp, int what, int extra) { - return genericOnError(mp, what, extra); - } - }; + private final android.media.MediaPlayer.OnErrorListener videoErrorListener = this::genericOnError; private boolean genericOnError(Object inObj, int what, int extra) { return callback.onMediaPlayerError(inObj, what, extra); } - private final org.antennapod.audio.MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener = new org.antennapod.audio.MediaPlayer.OnSeekCompleteListener() { - @Override - public void onSeekComplete(org.antennapod.audio.MediaPlayer mp) { - genericSeekCompleteListener(); - } - }; + private final org.antennapod.audio.MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener = + mp -> genericSeekCompleteListener(); - private final android.media.MediaPlayer.OnSeekCompleteListener videoSeekCompleteListener = new android.media.MediaPlayer.OnSeekCompleteListener() { - @Override - public void onSeekComplete(android.media.MediaPlayer mp) { - genericSeekCompleteListener(); - } - }; + private final android.media.MediaPlayer.OnSeekCompleteListener videoSeekCompleteListener = + mp -> genericSeekCompleteListener(); - private final void genericSeekCompleteListener() { + private void genericSeekCompleteListener() { Thread t = new Thread(() -> { Log.d(TAG, "genericSeekCompleteListener"); if(seekLatch != null) { 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 680fb8777..8a0964d36 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 @@ -6,12 +6,10 @@ import android.support.annotation.NonNull; import android.util.Log; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.event.QueueEvent; @@ -65,13 +63,10 @@ public class PlaybackServiceTaskManager { @NonNull PSTMCallback callback) { this.context = context; this.callback = callback; - schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE, new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } + schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE, r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; }); loadQueue(); EventBus.getDefault().register(this); @@ -95,12 +90,7 @@ public class PlaybackServiceTaskManager { private synchronized void loadQueue() { if (!isQueueLoaderActive()) { - queueFuture = schedExecutor.submit(new Callable>() { - @Override - public List call() throws Exception { - return DBReader.getQueue(); - } - }); + queueFuture = schedExecutor.submit(DBReader::getQueue); } } @@ -112,9 +102,7 @@ public class PlaybackServiceTaskManager { if (queueFuture.isDone()) { try { return queueFuture.get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } @@ -137,12 +125,7 @@ public class PlaybackServiceTaskManager { */ public synchronized void startPositionSaver() { if (!isPositionSaverActive()) { - Runnable positionSaver = new Runnable() { - @Override - public void run() { - callback.positionSaverTick(); - } - }; + Runnable positionSaver = callback::positionSaverTick; positionSaverFuture = schedExecutor.scheduleWithFixedDelay(positionSaver, POSITION_SAVER_WAITING_INTERVAL, POSITION_SAVER_WAITING_INTERVAL, TimeUnit.MILLISECONDS); @@ -174,12 +157,7 @@ public class PlaybackServiceTaskManager { */ public synchronized void startWidgetUpdater() { if (!isWidgetUpdaterActive()) { - Runnable widgetUpdater = new Runnable() { - @Override - public void run() { - callback.onWidgetUpdaterTick(); - } - }; + Runnable widgetUpdater = callback::onWidgetUpdaterTick; widgetUpdaterFuture = schedExecutor.scheduleWithFixedDelay(widgetUpdater, WIDGET_UPDATER_NOTIFICATION_INTERVAL, WIDGET_UPDATER_NOTIFICATION_INTERVAL, TimeUnit.MILLISECONDS); @@ -279,18 +257,15 @@ public class PlaybackServiceTaskManager { cancelChapterLoader(); } - Runnable chapterLoader = new Runnable() { - @Override - public void run() { - Log.d(TAG, "Chapter loader started"); - if (media.getChapters() == null) { - media.loadChapterMarks(); - if (!Thread.currentThread().isInterrupted() && media.getChapters() != null) { - callback.onChapterLoaded(media); - } + Runnable chapterLoader = () -> { + Log.d(TAG, "Chapter loader started"); + if (media.getChapters() == null) { + media.loadChapterMarks(); + if (!Thread.currentThread().isInterrupted() && media.getChapters() != null) { + callback.onChapterLoaded(media); } - Log.d(TAG, "Chapter loader stopped"); } + Log.d(TAG, "Chapter loader stopped"); }; chapterLoaderFuture = schedExecutor.submit(chapterLoader); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java index 80703e22d..e94874453 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java @@ -13,8 +13,6 @@ import java.util.concurrent.ExecutionException; 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.util.LongList; /** * Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod. diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java index 26dc027bf..aa97b321a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java @@ -33,73 +33,70 @@ public class APDownloadAlgorithm implements AutomaticDownloadAlgorithm { */ @Override public Runnable autoDownloadUndownloadedItems(final Context context) { - return new Runnable() { - @Override - public void run() { - - // true if we should auto download based on network status - boolean networkShouldAutoDl = NetworkUtils.autodownloadNetworkAvailable() - && UserPreferences.isEnableAutodownload(); - - // true if we should auto download based on power status - boolean powerShouldAutoDl = PowerUtils.deviceCharging(context) - || UserPreferences.isEnableAutodownloadOnBattery(); - - // we should only auto download if both network AND power are happy - if (networkShouldAutoDl && powerShouldAutoDl) { - - Log.d(TAG, "Performing auto-dl of undownloaded episodes"); - - List candidates; - final List queue = DBReader.getQueue(); - final List newItems = DBReader.getNewItemsList(); - candidates = new ArrayList(queue.size() + newItems.size()); - candidates.addAll(queue); - for(FeedItem newItem : newItems) { - FeedPreferences feedPrefs = newItem.getFeed().getPreferences(); - FeedFilter feedFilter = feedPrefs.getFilter(); - if(candidates.contains(newItem) == false && feedFilter.shouldAutoDownload(newItem)) { - candidates.add(newItem); - } - } - - // filter items that are not auto downloadable - Iterator it = candidates.iterator(); - while(it.hasNext()) { - FeedItem item = it.next(); - if(item.isAutoDownloadable() == false) { - it.remove(); - } + return () -> { + + // true if we should auto download based on network status + boolean networkShouldAutoDl = NetworkUtils.autodownloadNetworkAvailable() + && UserPreferences.isEnableAutodownload(); + + // true if we should auto download based on power status + boolean powerShouldAutoDl = PowerUtils.deviceCharging(context) + || UserPreferences.isEnableAutodownloadOnBattery(); + + // we should only auto download if both network AND power are happy + if (networkShouldAutoDl && powerShouldAutoDl) { + + Log.d(TAG, "Performing auto-dl of undownloaded episodes"); + + List candidates; + final List queue = DBReader.getQueue(); + final List newItems = DBReader.getNewItemsList(); + candidates = new ArrayList<>(queue.size() + newItems.size()); + candidates.addAll(queue); + for(FeedItem newItem : newItems) { + FeedPreferences feedPrefs = newItem.getFeed().getPreferences(); + FeedFilter feedFilter = feedPrefs.getFilter(); + if(!candidates.contains(newItem) && feedFilter.shouldAutoDownload(newItem)) { + candidates.add(newItem); } + } - int autoDownloadableEpisodes = candidates.size(); - int downloadedEpisodes = DBReader.getNumberOfDownloadedEpisodes(); - int deletedEpisodes = UserPreferences.getEpisodeCleanupAlgorithm() - .makeRoomForEpisodes(context, autoDownloadableEpisodes); - boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences - .getEpisodeCacheSizeUnlimited(); - int episodeCacheSize = UserPreferences.getEpisodeCacheSize(); - - int episodeSpaceLeft; - if (cacheIsUnlimited || - episodeCacheSize >= downloadedEpisodes + autoDownloadableEpisodes) { - episodeSpaceLeft = autoDownloadableEpisodes; - } else { - episodeSpaceLeft = episodeCacheSize - (downloadedEpisodes - deletedEpisodes); + // filter items that are not auto downloadable + Iterator it = candidates.iterator(); + while(it.hasNext()) { + FeedItem item = it.next(); + if(!item.isAutoDownloadable()) { + it.remove(); } + } - FeedItem[] itemsToDownload = candidates.subList(0, episodeSpaceLeft) - .toArray(new FeedItem[episodeSpaceLeft]); + int autoDownloadableEpisodes = candidates.size(); + int downloadedEpisodes = DBReader.getNumberOfDownloadedEpisodes(); + int deletedEpisodes = UserPreferences.getEpisodeCleanupAlgorithm() + .makeRoomForEpisodes(context, autoDownloadableEpisodes); + boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences + .getEpisodeCacheSizeUnlimited(); + int episodeCacheSize = UserPreferences.getEpisodeCacheSize(); + + int episodeSpaceLeft; + if (cacheIsUnlimited || + episodeCacheSize >= downloadedEpisodes + autoDownloadableEpisodes) { + episodeSpaceLeft = autoDownloadableEpisodes; + } else { + episodeSpaceLeft = episodeCacheSize - (downloadedEpisodes - deletedEpisodes); + } - Log.d(TAG, "Enqueueing " + itemsToDownload.length + " items for download"); + FeedItem[] itemsToDownload = candidates.subList(0, episodeSpaceLeft) + .toArray(new FeedItem[episodeSpaceLeft]); - try { - DBTasks.downloadFeedItems(false, context, itemsToDownload); - } catch (DownloadRequestException e) { - e.printStackTrace(); - } + Log.d(TAG, "Enqueueing " + itemsToDownload.length + " items for download"); + try { + DBTasks.downloadFeedItems(false, context, itemsToDownload); + } catch (DownloadRequestException e) { + e.printStackTrace(); } + } }; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java index baa9a986e..04b200699 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java @@ -5,15 +5,12 @@ import android.support.annotation.NonNull; import android.util.Log; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.ExecutionException; import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.util.LongList; /** * A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java index 72c68ddb6..dbb77e19c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java @@ -14,5 +14,5 @@ public interface AutomaticDownloadAlgorithm { * @param context Used for accessing the DB. * @return A Runnable that will be submitted to an ExecutorService. */ - public Runnable autoDownloadUndownloadedItems(Context context); + Runnable autoDownloadUndownloadedItems(Context context); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java index ed593bb82..47e2d8a26 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java @@ -48,13 +48,10 @@ public final class DBTasks { private static ExecutorService autodownloadExec; static { - autodownloadExec = Executors.newSingleThreadExecutor(new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(r); - t.setPriority(Thread.MIN_PRIORITY); - return t; - } + autodownloadExec = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r); + t.setPriority(Thread.MIN_PRIORITY); + return t; }); } @@ -85,9 +82,7 @@ public final class DBTasks { if (feedID != 0) { try { DBWriter.deleteFeed(context, feedID).get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } else { @@ -114,7 +109,7 @@ public final class DBTasks { boolean showPlayer, boolean startWhenPrepared, boolean shouldStream) { try { if (!shouldStream) { - if (media.fileExists() == false) { + if (!media.fileExists()) { throw new MediaFileNotFoundException( "No episode was found at " + media.getFile_url(), media); @@ -518,8 +513,8 @@ public final class DBTasks { */ public static synchronized Feed[] updateFeed(final Context context, final Feed... newFeeds) { - List newFeedsList = new ArrayList(); - List updatedFeedsList = new ArrayList(); + List newFeedsList = new ArrayList<>(); + List updatedFeedsList = new ArrayList<>(); Feed[] resultFeeds = new Feed[newFeeds.length]; PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); @@ -611,9 +606,7 @@ public final class DBTasks { try { DBWriter.addNewFeed(context, newFeedsList.toArray(new Feed[newFeedsList.size()])).get(); DBWriter.setCompleteFeed(updatedFeedsList.toArray(new Feed[updatedFeedsList.size()])).get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } @@ -633,7 +626,7 @@ public final class DBTasks { */ public static FutureTask> searchFeedItemTitle(final Context context, final long feedID, final String query) { - return new FutureTask>(new QueryTask>(context) { + return new FutureTask<>(new QueryTask>(context) { @Override public void execute(PodDBAdapter adapter) { Cursor searchResult = adapter.searchItemTitles(feedID, @@ -657,7 +650,7 @@ public final class DBTasks { */ public static FutureTask> searchFeedItemDescription(final Context context, final long feedID, final String query) { - return new FutureTask>(new QueryTask>(context) { + return new FutureTask<>(new QueryTask>(context) { @Override public void execute(PodDBAdapter adapter) { Cursor searchResult = adapter.searchItemDescriptions(feedID, @@ -681,7 +674,7 @@ public final class DBTasks { */ public static FutureTask> searchFeedItemContentEncoded(final Context context, final long feedID, final String query) { - return new FutureTask>(new QueryTask>(context) { + return new FutureTask<>(new QueryTask>(context) { @Override public void execute(PodDBAdapter adapter) { Cursor searchResult = adapter.searchItemContentEncoded(feedID, @@ -704,7 +697,7 @@ public final class DBTasks { */ public static FutureTask> searchFeedItemChapters(final Context context, final long feedID, final String query) { - return new FutureTask>(new QueryTask>(context) { + return new FutureTask<>(new QueryTask>(context) { @Override public void execute(PodDBAdapter adapter) { Cursor searchResult = adapter.searchItemChapters(feedID, 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 e728abc3b..7dad9cb08 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 @@ -14,7 +14,6 @@ import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -132,7 +131,7 @@ public class DBWriter { } } Log.d(TAG, "Deleting File. Result: " + result); - EventBus.getDefault().post(FeedItemEvent.deletedMedia(Arrays.asList(media.getItem()))); + EventBus.getDefault().post(FeedItemEvent.deletedMedia(Collections.singletonList(media.getItem()))); EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast(); } }); @@ -372,7 +371,7 @@ public class DBWriter { if (queue != null) { boolean queueModified = false; LongList markAsUnplayedIds = new LongList(); - List events = new ArrayList(); + List events = new ArrayList<>(); for (int i = 0; i < itemIds.length; i++) { if (!itemListContains(queue, itemIds[i])) { final FeedItem item = DBReader.getFeedItem(itemIds[i]); @@ -545,9 +544,7 @@ public class DBWriter { */ public static Future moveQueueItem(final int from, final int to, final boolean broadcastUpdate) { - return dbExec.submit(() -> { - moveQueueItemHelper(from, to, broadcastUpdate); - }); + return dbExec.submit(() -> moveQueueItemHelper(from, to, broadcastUpdate)); } /** diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java index 22c9538ca..04afc504b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java @@ -51,7 +51,7 @@ public class DownloadRequester { private Map downloads; private DownloadRequester() { - downloads = new ConcurrentHashMap(); + downloads = new ConcurrentHashMap<>(); } public static synchronized DownloadRequester getInstance() { @@ -268,10 +268,7 @@ public class DownloadRequester { * Checks if feedfile is in the downloads list */ public synchronized boolean isDownloadingFile(FeedFile item) { - if (item.getDownload_url() != null) { - return downloads.containsKey(item.getDownload_url()); - } - return false; + return item.getDownload_url() != null && downloads.containsKey(item.getDownload_url()); } public synchronized DownloadRequest getDownload(String downloadUrl) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java index 3a63685ba..d7c9e9108 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java @@ -1,10 +1,6 @@ package de.danoeh.antennapod.core.storage; import android.content.Context; -import de.danoeh.antennapod.core.R; -import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.SearchResult; -import de.danoeh.antennapod.core.util.comparator.SearchResultValueComparator; import java.util.ArrayList; import java.util.Collections; @@ -12,6 +8,11 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; +import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.SearchResult; +import de.danoeh.antennapod.core.util.comparator.SearchResultValueComparator; + /** * Performs search on Feeds and FeedItems */ @@ -30,7 +31,7 @@ public class FeedSearcher { context.getString(R.string.found_in_chapters_label), context.getString(R.string.found_in_title_label)}; - List result = new ArrayList(); + List result = new ArrayList<>(); FutureTask>[] tasks = new FutureTask[4]; (tasks[0] = DBTasks.searchFeedItemContentEncoded(context, selectedFeed, query)).run(); @@ -46,9 +47,7 @@ public class FeedSearcher { } } - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } Collections.sort(result, new SearchResultValueComparator()); diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index 5b7f5f720..ffe5b2f24 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -425,7 +425,7 @@ public class PodDBAdapter { */ public long setImage(FeedImage image) { boolean startedTransaction = false; - if(false == db.inTransaction()) { + if(!db.inTransaction()) { db.beginTransaction(); startedTransaction = true; } @@ -972,9 +972,8 @@ public class PodDBAdapter { * @return The cursor of the query */ public final Cursor getAllFeedsCursor() { - Cursor c = db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, null, null, null, null, + return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, null, null, null, null, KEY_TITLE + " COLLATE NOCASE ASC"); - return c; } public final Cursor getFeedCursorDownloadUrls() { @@ -992,22 +991,19 @@ public class PodDBAdapter { } public final Cursor getAllItemsOfFeedCursor(final long feedId) { - Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_FEED + return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_FEED + "=?", new String[]{String.valueOf(feedId)}, null, null, - null - ); - return c; + null); } /** * Return a cursor with the SEL_FI_EXTRA selection of a single feeditem. */ public final Cursor getExtraInformationOfItem(final FeedItem item) { - Cursor c = db + return db .query(TABLE_NAME_FEED_ITEMS, SEL_FI_EXTRA, KEY_ID + "=?", new String[]{String.valueOf(item.getId())}, null, null, null); - return c; } /** @@ -1017,10 +1013,9 @@ public class PodDBAdapter { * @return The cursor of the query */ public final Cursor getFeedMediaOfItemCursor(final FeedItem item) { - Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + "=?", + return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + "=?", new String[]{String.valueOf(item.getMedia().getId())}, null, null, null); - return c; } /** @@ -1065,25 +1060,22 @@ public class PodDBAdapter { } public final Cursor getSimpleChaptersOfFeedItemCursor(final FeedItem item) { - Cursor c = db.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM + return db.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM + "=?", new String[]{String.valueOf(item.getId())}, null, null, null ); - return c; } public final Cursor getDownloadLog(final int feedFileType, final long feedFileId) { final String query = "SELECT * FROM " + TABLE_NAME_DOWNLOAD_LOG + " WHERE " + KEY_FEEDFILE + "=" + feedFileId + " AND " + KEY_FEEDFILETYPE + "=" + feedFileType + " ORDER BY " + KEY_ID + " DESC"; - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } public final Cursor getDownloadLogCursor(final int limit) { - Cursor c = db.query(TABLE_NAME_DOWNLOAD_LOG, null, null, null, null, + return db.query(TABLE_NAME_DOWNLOAD_LOG, null, null, null, null, null, KEY_COMPLETION_DATE + " DESC LIMIT " + limit); - return c; } /** @@ -1099,13 +1091,11 @@ public class PodDBAdapter { TABLE_NAME_QUEUE + "." + KEY_FEEDITEM, TABLE_NAME_QUEUE + "." + KEY_ID }; String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args); - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } public Cursor getQueueIDCursor() { - Cursor c = db.query(TABLE_NAME_QUEUE, new String[]{KEY_FEEDITEM}, null, null, null, null, KEY_ID + " ASC", null); - return c; + return db.query(TABLE_NAME_QUEUE, new String[]{KEY_FEEDITEM}, null, null, null, null, KEY_ID + " ASC", null); } @@ -1117,8 +1107,7 @@ public class PodDBAdapter { TABLE_NAME_FAVORITES + "." + KEY_FEEDITEM, TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE }; String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s DESC", args); - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } /** @@ -1126,9 +1115,8 @@ public class PodDBAdapter { * The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection. */ public final Cursor getUnreadItemsCursor() { - Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_READ + return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_READ + "<" + FeedItem.PLAYED, null, null, null, KEY_PUBDATE + " DESC"); - return c; } /** @@ -1141,8 +1129,7 @@ public class PodDBAdapter { + " WHERE " + KEY_FEED + "=" + feedId + " AND " + KEY_READ + "=" + FeedItem.NEW + " ORDER BY " + KEY_PUBDATE + " DESC"; - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } /** @@ -1160,13 +1147,11 @@ public class PodDBAdapter { KEY_PUBDATE + " DESC" }; final String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s WHERE %s ORDER BY %s", args); - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } public final Cursor getRecentlyPublishedItemsCursor(int limit) { - Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, null, null, null, null, KEY_PUBDATE + " DESC LIMIT " + limit); - return c; + return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, null, null, null, null, KEY_PUBDATE + " DESC LIMIT " + limit); } public Cursor getDownloadedItemsCursor() { @@ -1175,8 +1160,7 @@ public class PodDBAdapter { + " INNER JOIN " + TABLE_NAME_FEED_MEDIA + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "=" + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM + " WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + ">0"; - Cursor c = db.rawQuery(query, null); - return c; + return db.rawQuery(query, null); } /** @@ -1192,10 +1176,9 @@ public class PodDBAdapter { throw new IllegalArgumentException("Limit must be >= 0"); } - Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null, + return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_PLAYBACK_COMPLETION_DATE + " > 0", null, null, null, String.format("%s DESC LIMIT %d", KEY_PLAYBACK_COMPLETION_DATE, limit)); - return c; } public final Cursor getSingleFeedMediaCursor(long id) { @@ -1244,18 +1227,17 @@ public class PodDBAdapter { if (size == 1) { return "(?)"; } - StringBuffer buffer = new StringBuffer("("); + StringBuilder builder = new StringBuilder("("); for (int i = 0; i < size - 1; i++) { - buffer.append("?,"); + builder.append("?,"); } - buffer.append("?)"); - return buffer.toString(); + builder.append("?)"); + return builder.toString(); } public final Cursor getFeedCursor(final long id) { - Cursor c = db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, KEY_ID + "=" + id, null, + return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, KEY_ID + "=" + id, null, null, null, null); - return c; } public final Cursor getFeedItemCursor(final String id) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java index 9280db8a3..66513a12e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java @@ -47,10 +47,10 @@ public class HandlerState { public HandlerState(Feed feed) { this.feed = feed; alternateUrls = new ArrayMap<>(); - items = new ArrayList(); - tagstack = new Stack(); + items = new ArrayList<>(); + tagstack = new Stack<>(); namespaces = new ArrayMap<>(); - defaultNamespaces = new Stack(); + defaultNamespaces = new Stack<>(); tempObjects = new ArrayMap<>(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java index 4d56e1365..f84d6ee96 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java @@ -41,27 +41,28 @@ public class TypeGetter { while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { String tag = xpp.getName(); - if (tag.equals(ATOM_ROOT)) { - feed.setType(Feed.TYPE_ATOM1); - Log.d(TAG, "Recognized type Atom"); - return Type.ATOM; - } else if (tag.equals(RSS_ROOT)) { - String strVersion = xpp.getAttributeValue(null, "version"); - if (strVersion != null) { - if (strVersion.equals("2.0")) { - feed.setType(Feed.TYPE_RSS2); - Log.d(TAG, "Recognized type RSS 2.0"); - return Type.RSS20; - } else if (strVersion.equals("0.91") - || strVersion.equals("0.92")) { - Log.d(TAG, "Recognized type RSS 0.91/0.92"); - return Type.RSS091; + switch (tag) { + case ATOM_ROOT: + feed.setType(Feed.TYPE_ATOM1); + Log.d(TAG, "Recognized type Atom"); + return Type.ATOM; + case RSS_ROOT: + String strVersion = xpp.getAttributeValue(null, "version"); + if (strVersion != null) { + if (strVersion.equals("2.0")) { + feed.setType(Feed.TYPE_RSS2); + Log.d(TAG, "Recognized type RSS 2.0"); + return Type.RSS20; + } else if (strVersion.equals("0.91") + || strVersion.equals("0.92")) { + Log.d(TAG, "Recognized type RSS 0.91/0.92"); + return Type.RSS091; + } } - } - throw new UnsupportedFeedtypeException(Type.INVALID); - } else { - Log.d(TAG, "Type is invalid"); - throw new UnsupportedFeedtypeException(Type.INVALID, tag); + throw new UnsupportedFeedtypeException(Type.INVALID); + default: + Log.d(TAG, "Type is invalid"); + throw new UnsupportedFeedtypeException(Type.INVALID, tag); } } else { eventType = xpp.next(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java index 8dd9ffe4b..5169f7e76 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java @@ -10,7 +10,6 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import java.util.List; @@ -63,11 +62,7 @@ public class ChapterUtils { } else { Log.i(TAG, "ChapterReader could not find any ID3 chapters"); } - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (ID3ReaderException e) { + } catch (IOException | ID3ReaderException e) { e.printStackTrace(); } finally { if (in != null) { @@ -116,9 +111,7 @@ public class ChapterUtils { Log.i(TAG, "ChapterReader could not find any ID3 chapters"); } - } catch (IOException e) { - e.printStackTrace(); - } catch (ID3ReaderException e) { + } catch (IOException | ID3ReaderException e) { e.printStackTrace(); } finally { if (in != null) { @@ -144,8 +137,6 @@ public class ChapterUtils { if (input != null) { readOggChaptersFromInputStream(media, input); } - } catch (MalformedURLException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java index d3f6c6b79..4ad88743f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java @@ -25,7 +25,7 @@ public enum DownloadError { private final int code; private final int resId; - private DownloadError(int code, int resId) { + DownloadError(int code, int resId) { this.code = code; this.resId = resId; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java b/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java index 029e7fe84..89edd7dbe 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java @@ -13,7 +13,7 @@ public class EpisodeFilter { /** Return a copy of the itemlist without items which have no media. */ public static ArrayList getEpisodeList(List items) { - ArrayList episodes = new ArrayList(items); + ArrayList episodes = new ArrayList<>(items); for (FeedItem item : items) { if (item.getMedia() == null) { episodes.remove(item); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java b/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java index 1cbe7fade..f48b9169b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java @@ -62,7 +62,7 @@ public final class IntList { @Override public String toString() { - StringBuffer sb = new StringBuffer(size * 5 + 10); + StringBuilder sb = new StringBuilder(size * 5 + 10); sb.append("IntList{"); for (int i = 0; i < size; i++) { if (i != 0) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java b/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java index 6ed8b820e..fdc244517 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java @@ -73,7 +73,7 @@ public final class LongList { @Override public String toString() { - StringBuffer sb = new StringBuffer(size * 5 + 10); + StringBuilder sb = new StringBuilder(size * 5 + 10); sb.append("LongList{"); for (int i = 0; i < size; i++) { if (i != 0) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java index c2cd273b8..927639e69 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java @@ -96,7 +96,7 @@ public class NetworkUtils { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - if (false == NetworkUtils.isDownloadAllowed()) { + if (!NetworkUtils.isDownloadAllowed()) { subscriber.onNext(0L); subscriber.onCompleted(); return; @@ -107,7 +107,7 @@ public class NetworkUtils { if (mediaFile.exists()) { size = mediaFile.length(); } - } else if (false == media.checkedOnSizeButUnknown()) { + } else if (!media.checkedOnSizeButUnknown()) { // only query the network if we haven't already checked String url = media.getDownload_url(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java index 71d6040ba..5dc194dbd 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java @@ -2,12 +2,12 @@ package de.danoeh.antennapod.core.util; import android.content.Context; +import java.util.Comparator; + import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.storage.DBWriter; -import java.util.Comparator; - /** * Provides method for sorting the queue according to rules. */ @@ -26,59 +26,39 @@ public class QueueSorter { switch (rule) { case ALPHA_ASC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f1.getTitle().compareTo(f2.getTitle()); - } - }; + comparator = (f1, f2) -> f1.getTitle().compareTo(f2.getTitle()); break; case ALPHA_DESC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f2.getTitle().compareTo(f1.getTitle()); - } - }; + comparator = (f1, f2) -> f2.getTitle().compareTo(f1.getTitle()); break; case DATE_ASC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f1.getPubDate().compareTo(f2.getPubDate()); - } - }; + comparator = (f1, f2) -> f1.getPubDate().compareTo(f2.getPubDate()); break; case DATE_DESC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f2.getPubDate().compareTo(f1.getPubDate()); - } - }; + comparator = (f1, f2) -> f2.getPubDate().compareTo(f1.getPubDate()); break; case DURATION_ASC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - FeedMedia f1Media = f1.getMedia(); - FeedMedia f2Media = f2.getMedia(); - int duration1 = f1Media != null ? f1Media.getDuration() : -1; - int duration2 = f2Media != null ? f2Media.getDuration() : -1; + comparator = (f1, f2) -> { + FeedMedia f1Media = f1.getMedia(); + FeedMedia f2Media = f2.getMedia(); + int duration1 = f1Media != null ? f1Media.getDuration() : -1; + int duration2 = f2Media != null ? f2Media.getDuration() : -1; - if (duration1 == -1 || duration2 == -1) - return duration2 - duration1; - else - return duration1 - duration2; - } + if (duration1 == -1 || duration2 == -1) + return duration2 - duration1; + else + return duration1 - duration2; }; break; case DURATION_DESC: - comparator = new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { + comparator = (f1, f2) -> { FeedMedia f1Media = f1.getMedia(); FeedMedia f2Media = f2.getMedia(); int duration1 = f1Media != null ? f1Media.getDuration() : -1; int duration2 = f2Media != null ? f2Media.getDuration() : -1; return -1 * (duration1 - duration2); - } - }; + }; default: } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java b/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java index 7e7c6c08b..a4cd83f70 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java @@ -11,6 +11,6 @@ public interface ShownotesProvider { * database, it should be done in a separate thread. After the shownotes * have been loaded, callback.onShownotesLoaded should be called. */ - public Callable loadShownotes(); + Callable loadShownotes(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java index 092c06b4a..e093dc766 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java @@ -1,13 +1,14 @@ package de.danoeh.antennapod.core.util; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import de.danoeh.antennapod.core.BuildConfig; + /** * Utility methods for dealing with URL encoding. */ @@ -26,9 +27,7 @@ public class URIUtil { try { URL url = new URL(source); return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); - } catch (MalformedURLException e) { - throw new IllegalArgumentException(e); - } catch (URISyntaxException e) { + } catch (MalformedURLException | URISyntaxException e) { throw new IllegalArgumentException(e); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java index d56871fd1..386f46724 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java @@ -19,12 +19,9 @@ public class MoreContentListFooterUtil { public MoreContentListFooterUtil(View root) { this.root = root; - root.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null && !loading) { - listener.onClick(); - } + root.setOnClickListener(v -> { + if (listener != null && !loading) { + listener.onClick(); } }); } @@ -46,8 +43,8 @@ public class MoreContentListFooterUtil { listener = l; } - public static interface Listener { - public void onClick(); + public interface Listener { + void onClick(); } public View getRoot() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java index 9f3c4c6d5..1807421b0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java @@ -1,11 +1,6 @@ package de.danoeh.antennapod.core.util.id3reader; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; -import de.danoeh.antennapod.core.feed.Chapter; -import de.danoeh.antennapod.core.feed.ID3Chapter; -import de.danoeh.antennapod.core.util.id3reader.model.FrameHeader; -import de.danoeh.antennapod.core.util.id3reader.model.TagHeader; import java.io.IOException; import java.io.InputStream; @@ -13,6 +8,12 @@ import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; +import de.danoeh.antennapod.core.BuildConfig; +import de.danoeh.antennapod.core.feed.Chapter; +import de.danoeh.antennapod.core.feed.ID3Chapter; +import de.danoeh.antennapod.core.util.id3reader.model.FrameHeader; +import de.danoeh.antennapod.core.util.id3reader.model.TagHeader; + public class ChapterReader extends ID3Reader { private static final String TAG = "ID3ChapterReader"; @@ -25,7 +26,7 @@ public class ChapterReader extends ID3Reader { @Override public int onStartTagHeader(TagHeader header) { - chapters = new ArrayList(); + chapters = new ArrayList<>(); System.out.println(header.toString()); return ID3Reader.ACTION_DONT_SKIP; } @@ -34,49 +35,53 @@ public class ChapterReader extends ID3Reader { public int onStartFrameHeader(FrameHeader header, InputStream input) throws IOException, ID3ReaderException { System.out.println(header.toString()); - if (header.getId().equals(FRAME_ID_CHAPTER)) { - if (currentChapter != null) { - if (!hasId3Chapter(currentChapter)) { - chapters.add(currentChapter); - if (BuildConfig.DEBUG) Log.d(TAG, "Found chapter: " + currentChapter); - currentChapter = null; + switch (header.getId()) { + case FRAME_ID_CHAPTER: + if (currentChapter != null) { + if (!hasId3Chapter(currentChapter)) { + chapters.add(currentChapter); + if (BuildConfig.DEBUG) Log.d(TAG, "Found chapter: " + currentChapter); + currentChapter = null; + } } - } - StringBuffer elementId = new StringBuffer(); - readISOString(elementId, input, Integer.MAX_VALUE); - char[] startTimeSource = readBytes(input, 4); - long startTime = ((int) startTimeSource[0] << 24) - | ((int) startTimeSource[1] << 16) - | ((int) startTimeSource[2] << 8) | startTimeSource[3]; - currentChapter = new ID3Chapter(elementId.toString(), startTime); - skipBytes(input, 12); - return ID3Reader.ACTION_DONT_SKIP; - } else if (header.getId().equals(FRAME_ID_TITLE)) { - if (currentChapter != null && currentChapter.getTitle() == null) { - StringBuffer title = new StringBuffer(); - readString(title, input, header.getSize()); - currentChapter - .setTitle(title.toString()); - if (BuildConfig.DEBUG) Log.d(TAG, "Found title: " + currentChapter.getTitle()); - + StringBuffer elementId = new StringBuffer(); + readISOString(elementId, input, Integer.MAX_VALUE); + char[] startTimeSource = readBytes(input, 4); + long startTime = ((int) startTimeSource[0] << 24) + | ((int) startTimeSource[1] << 16) + | ((int) startTimeSource[2] << 8) | startTimeSource[3]; + currentChapter = new ID3Chapter(elementId.toString(), startTime); + skipBytes(input, 12); return ID3Reader.ACTION_DONT_SKIP; - } - } else if (header.getId().equals(FRAME_ID_LINK)) { - if (currentChapter != null) { - // skip description - int descriptionLength = readString(null, input, header.getSize()); - StringBuffer link = new StringBuffer(); - readISOString(link, input, header.getSize() - descriptionLength); - String decodedLink = URLDecoder.decode(link.toString(), "UTF-8"); - - currentChapter.setLink(decodedLink); - - if (BuildConfig.DEBUG) Log.d(TAG, "Found link: " + currentChapter.getLink()); - return ID3Reader.ACTION_DONT_SKIP; - } - } else if (header.getId().equals("APIC")) { - Log.d(TAG, header.toString()); - } + case FRAME_ID_TITLE: + if (currentChapter != null && currentChapter.getTitle() == null) { + StringBuffer title = new StringBuffer(); + readString(title, input, header.getSize()); + currentChapter + .setTitle(title.toString()); + if (BuildConfig.DEBUG) Log.d(TAG, "Found title: " + currentChapter.getTitle()); + + return ID3Reader.ACTION_DONT_SKIP; + } + break; + case FRAME_ID_LINK: + if (currentChapter != null) { + // skip description + int descriptionLength = readString(null, input, header.getSize()); + StringBuffer link = new StringBuffer(); + readISOString(link, input, header.getSize() - descriptionLength); + String decodedLink = URLDecoder.decode(link.toString(), "UTF-8"); + + currentChapter.setLink(decodedLink); + + if (BuildConfig.DEBUG) Log.d(TAG, "Found link: " + currentChapter.getLink()); + return ID3Reader.ACTION_DONT_SKIP; + } + break; + case "APIC": + Log.d(TAG, header.toString()); + break; + } return super.onStartFrameHeader(header, input); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java index ec50dce7c..412a27b95 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java @@ -6,13 +6,14 @@ import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; -import de.danoeh.antennapod.core.feed.Chapter; -import de.danoeh.antennapod.core.feed.MediaType; -import de.danoeh.antennapod.core.util.ChapterUtils; import java.util.List; import java.util.concurrent.Callable; +import de.danoeh.antennapod.core.feed.Chapter; +import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.util.ChapterUtils; + /** Represents a media file that is stored on the local storage device. */ public class ExternalMedia implements Playable { @@ -106,12 +107,7 @@ public class ExternalMedia implements Playable { @Override public Callable loadShownotes() { - return new Callable() { - @Override - public String call() throws Exception { - return ""; - } - }; + return () -> ""; } @Override diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java index 86ec4fbd0..6459d86ed 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java @@ -26,7 +26,7 @@ public interface Playable extends Parcelable, * Implementations must NOT call commit() after they have written the values * to the preferences file. */ - public void writeToPreferences(SharedPreferences.Editor prefEditor); + void writeToPreferences(SharedPreferences.Editor prefEditor); /** * This method is called from a separate thread by the PlaybackService. @@ -34,88 +34,88 @@ public interface Playable extends Parcelable, * should execute as quickly as possible and NOT load chapter marks if no * local file is available. */ - public void loadMetadata() throws PlayableException; + void loadMetadata() throws PlayableException; /** * This method is called from a separate thread by the PlaybackService. * Playable objects should load their chapter marks in this method if no * local file was available when loadMetadata() was called. */ - public void loadChapterMarks(); + void loadChapterMarks(); /** * Returns the title of the episode that this playable represents */ - public String getEpisodeTitle(); + String getEpisodeTitle(); /** * Returns a list of chapter marks or null if this Playable has no chapters. */ - public List getChapters(); + List getChapters(); /** * Returns a link to a website that is meant to be shown in a browser */ - public String getWebsiteLink(); + String getWebsiteLink(); - public String getPaymentLink(); + String getPaymentLink(); /** * Returns the title of the feed this Playable belongs to. */ - public String getFeedTitle(); + String getFeedTitle(); /** * Returns a unique identifier, for example a file url or an ID from a * database. */ - public Object getIdentifier(); + Object getIdentifier(); /** * Return duration of object or 0 if duration is unknown. */ - public int getDuration(); + int getDuration(); /** * Return position of object or 0 if position is unknown. */ - public int getPosition(); + int getPosition(); /** * Returns last time (in ms) when this playable was played or 0 * if last played time is unknown. */ - public long getLastPlayedTime(); + long getLastPlayedTime(); /** * Returns the type of media. This method should return the correct value * BEFORE loadMetadata() is called. */ - public MediaType getMediaType(); + MediaType getMediaType(); /** * Returns an url to a local file that can be played or null if this file * does not exist. */ - public String getLocalMediaUrl(); + String getLocalMediaUrl(); /** * Returns an url to a file that can be streamed by the player or null if * this url is not known. */ - public String getStreamUrl(); + String getStreamUrl(); /** * Returns true if a local file that can be played is available. getFileUrl * MUST return a non-null string if this method returns true. */ - public boolean localFileAvailable(); + boolean localFileAvailable(); /** * Returns true if a streamable file is available. getStreamUrl MUST return * a non-null string if this method returns true. */ - public boolean streamAvailable(); + boolean streamAvailable(); /** * Saves the current position of this object. Implementations can use the @@ -126,40 +126,40 @@ public interface Playable extends Parcelable, * @param newPosition new playback position in ms * @param timestamp current time in ms */ - public void saveCurrentPosition(SharedPreferences pref, int newPosition, long timestamp); + void saveCurrentPosition(SharedPreferences pref, int newPosition, long timestamp); - public void setPosition(int newPosition); + void setPosition(int newPosition); - public void setDuration(int newDuration); + void setDuration(int newDuration); /** * @param lastPlayedTimestamp timestamp in ms */ - public void setLastPlayedTime(long lastPlayedTimestamp); + void setLastPlayedTime(long lastPlayedTimestamp); /** * Is called by the PlaybackService when playback starts. */ - public void onPlaybackStart(); + void onPlaybackStart(); /** * Is called by the PlaybackService when playback is completed. */ - public void onPlaybackCompleted(); + void onPlaybackCompleted(); /** * 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 * Playable object that is restored. */ - public int getPlayableType(); + int getPlayableType(); - public void setChapters(List chapters); + void setChapters(List chapters); /** * Provides utility methods for Playable objects. */ - public static class PlayableUtils { + class PlayableUtils { private static final String TAG = "PlayableUtils"; /** @@ -213,7 +213,7 @@ public interface Playable extends Parcelable, } } - public static class PlayableException extends Exception { + class PlayableException extends Exception { private static final long serialVersionUID = 1L; public PlayableException() { 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 1a011a90b..016ff9a85 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 @@ -237,10 +237,9 @@ public abstract class PlaybackController { private void setupPositionObserver() { - if ((positionObserverFuture != null && positionObserverFuture - .isCancelled()) - || (positionObserverFuture != null && positionObserverFuture - .isDone()) || positionObserverFuture == null) { + if (positionObserverFuture == null || + positionObserverFuture.isCancelled() || + positionObserverFuture.isDone()) { Log.d(TAG, "Setting up position observer"); positionObserver = new MediaPositionObserver(); @@ -360,31 +359,31 @@ public abstract class PlaybackController { } }; - public void setupGUI() {}; + public void setupGUI() {} - public void onPositionObserverUpdate() {}; + public void onPositionObserverUpdate() {} - public void onPlaybackSpeedChange() {}; + public void onPlaybackSpeedChange() {} - public void onShutdownNotification() {}; + public void onShutdownNotification() {} /** * Called when the currently displayed information should be refreshed. */ - public void onReloadNotification(int code) {}; + public void onReloadNotification(int code) {} - public void onBufferStart() {}; + public void onBufferStart() {} - public void onBufferEnd() {}; + public void onBufferEnd() {} - public void onBufferUpdate(float progress) {}; + public void onBufferUpdate(float progress) {} - public void onSleepTimerUpdate() {}; + public void onSleepTimerUpdate() {} - public void handleError(int code) {}; + public void handleError(int code) {} - public void onPlaybackEnd() {}; + public void onPlaybackEnd() {} public void repeatHandleStatus() { if (status != null && playbackService != null) { @@ -484,17 +483,17 @@ public abstract class PlaybackController { public ImageButton getPlayButton() { return null; - }; + } - public void postStatusMsg(int msg) {}; + public void postStatusMsg(int msg) {} - public void clearStatusMsg() {}; + public void clearStatusMsg() {} public boolean loadMediaInfo() { return false; - }; + } - public void onAwaitingVideoSurface() {}; + public void onAwaitingVideoSurface() {} /** * Called when connection to playback service has been established or @@ -528,7 +527,7 @@ public abstract class PlaybackController { } } - public void onServiceQueried() {}; + public void onServiceQueried() {} /** * Should be used by classes which implement the OnSeekBarChanged interface. @@ -591,7 +590,7 @@ public abstract class PlaybackController { playbackService.setStartWhenPrepared(!playbackService .isStartWhenPrepared()); if (reinitOnPause - && playbackService.isStartWhenPrepared() == false) { + && !playbackService.isStartWhenPrepared()) { playbackService.reinit(); } break; @@ -677,12 +676,10 @@ public abstract class PlaybackController { } public boolean canSetPlaybackSpeed() { - if (org.antennapod.audio.MediaPlayer.isPrestoLibraryInstalled(activity.getApplicationContext()) + return org.antennapod.audio.MediaPlayer.isPrestoLibraryInstalled(activity.getApplicationContext()) || UserPreferences.useSonic() - || Build.VERSION.SDK_INT >= 23) { - return true; - } - return playbackService != null && playbackService.canSetSpeed(); + || Build.VERSION.SDK_INT >= 23 + || playbackService != null && playbackService.canSetSpeed(); } public void setPlaybackSpeed(float speed) { @@ -716,10 +713,7 @@ public abstract class PlaybackController { } public boolean isPlayingVideo() { - if (playbackService != null) { - return PlaybackService.getCurrentMediaType() == MediaType.VIDEO; - } - return false; + return playbackService != null && PlaybackService.getCurrentMediaType() == MediaType.VIDEO; } public Pair getVideoSize() { @@ -751,9 +745,9 @@ public abstract class PlaybackController { public void reinitServiceIfPaused() { if (playbackService != null && playbackService.isStreaming() - && (playbackService.getStatus() == PlayerStatus.PAUSED || (playbackService - .getStatus() == PlayerStatus.PREPARING && playbackService - .isStartWhenPrepared() == false))) { + && (playbackService.getStatus() == PlayerStatus.PAUSED || + (playbackService.getStatus() == PlayerStatus.PREPARING && + !playbackService.isStartWhenPrepared()))) { playbackService.reinit(); } } @@ -768,13 +762,7 @@ public abstract class PlaybackController { @Override public void run() { if (playbackService != null && playbackService.getStatus() == PlayerStatus.PLAYING) { - activity.runOnUiThread(new Runnable() { - - @Override - public void run() { - onPositionObserverUpdate(); - } - }); + activity.runOnUiThread(PlaybackController.this::onPositionObserverUpdate); } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java index 8d9151396..efdf46a97 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java @@ -68,7 +68,7 @@ public class Timeline { private static final Pattern TIMECODE_LINK_REGEX = Pattern.compile("antennapod://timecode/((\\d+))"); private static final String TIMECODE_LINK = "%s"; private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b(?:(?:(([0-9][0-9])):))?(([0-9][0-9])):(([0-9][0-9]))\\b"); - private static final Pattern LINE_BREAK_REGEX = Pattern.compile("
"); + private static final Pattern LINE_BREAK_REGEX = Pattern.compile("
"); /** diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java index c4961a3ab..6243da5bc 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; public class VorbisCommentChapterReader extends VorbisCommentReader { - private static final String TAG = "VorbisCommentChapterReader"; + private static final String TAG = "VorbisCommentChptrReadr"; private static final String CHAPTER_KEY = "chapter\\d\\d\\d.*"; private static final String CHAPTER_ATTRIBUTE_TITLE = "name"; @@ -27,7 +27,7 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { @Override public void onVorbisCommentHeaderFound(VorbisCommentHeader header) { - chapters = new ArrayList(); + chapters = new ArrayList<>(); System.out.println(header.toString()); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java index 9639b9c42..49ea18721 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java @@ -180,13 +180,13 @@ public abstract class VorbisCommentReader { private String readContentVectorKey(InputStream input, long vectorLength) throws IOException { - StringBuffer buffer = new StringBuffer(); + StringBuilder builder = new StringBuilder(); for (int i = 0; i < vectorLength; i++) { char c = (char) input.read(); if (c == '=') { - return buffer.toString(); + return builder.toString(); } else { - buffer.append(c); + builder.append(c); } } return null; // no key found -- cgit v1.2.3 From 7992726cb8867362e55bdc4025dda6f661b21748 Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Tue, 22 Mar 2016 02:09:53 -0400 Subject: small typo --- .../antennapod/core/service/playback/PlaybackServiceMediaPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/src/main') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index ecec10871..0101feba9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -394,7 +394,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } /** - * Prepared media player for playback if the service is in the INITALIZED + * Prepares media player for playback if the service is in the INITALIZED * state. *

* This method is executed on an internal executor service. -- cgit v1.2.3 From 09bad517fcd03183824e93eebfb6d013027cd788 Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Tue, 22 Mar 2016 12:11:23 -0400 Subject: further fixes based on mfietz input --- .../main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java | 1 - .../antennapod/core/service/playback/PlaybackServiceMediaPlayer.java | 5 ----- 2 files changed, 6 deletions(-) (limited to 'core/src/main') diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java index 5c09a2302..513264a05 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java @@ -106,7 +106,6 @@ public class ApOkHttpUrlLoader implements ModelLoader { public Response intercept(Chain chain) throws IOException { com.squareup.okhttp.Request request = chain.request(); String url = request.urlString(); - // Context context = ClientConfig.applicationCallbacks.getApplicationInstance(); String authentication = DBReader.getImageAuthentication(url); if(TextUtils.isEmpty(authentication)) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index 0101feba9..15a96588c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -255,11 +255,6 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } setPlayerStatus(PlayerStatus.INITIALIZED, media); -// if (mediaType == MediaType.VIDEO) { -// VideoPlayer vp = (VideoPlayer) mediaPlayer; -// // vp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT); -// } - if (prepareImmediately) { setPlayerStatus(PlayerStatus.PREPARING, media); mediaPlayer.prepare(); -- cgit v1.2.3