From d0022e053e4abfe35dac4ae2d90c6960982181fd Mon Sep 17 00:00:00 2001 From: Raghul Jagannathan Date: Wed, 27 May 2015 08:31:42 +0800 Subject: Subscription view for managing feeds and Navigation drawer feed list cleanup --- .../src/main/res/drawable-hdpi/ic_folder_grey600_24dp.png | Bin 0 -> 227 bytes core/src/main/res/drawable-hdpi/ic_folder_white_24dp.png | Bin 0 -> 224 bytes .../src/main/res/drawable-mdpi/ic_folder_grey600_24dp.png | Bin 0 -> 207 bytes core/src/main/res/drawable-mdpi/ic_folder_white_24dp.png | Bin 0 -> 206 bytes .../main/res/drawable-xhdpi/ic_folder_grey600_24dp.png | Bin 0 -> 284 bytes core/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png | Bin 0 -> 273 bytes .../main/res/drawable-xxhdpi/ic_folder_grey600_24dp.png | Bin 0 -> 356 bytes .../src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png | Bin 0 -> 342 bytes .../main/res/drawable-xxxhdpi/ic_folder_grey600_24dp.png | Bin 0 -> 527 bytes .../main/res/drawable-xxxhdpi/ic_folder_white_24dp.png | Bin 0 -> 504 bytes core/src/main/res/values/arrays.xml | 1 + core/src/main/res/values/attrs.xml | 1 + core/src/main/res/values/strings.xml | 1 + core/src/main/res/values/styles.xml | 4 ++++ 14 files changed, 7 insertions(+) create mode 100755 core/src/main/res/drawable-hdpi/ic_folder_grey600_24dp.png create mode 100755 core/src/main/res/drawable-hdpi/ic_folder_white_24dp.png create mode 100755 core/src/main/res/drawable-mdpi/ic_folder_grey600_24dp.png create mode 100755 core/src/main/res/drawable-mdpi/ic_folder_white_24dp.png create mode 100755 core/src/main/res/drawable-xhdpi/ic_folder_grey600_24dp.png create mode 100755 core/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png create mode 100755 core/src/main/res/drawable-xxhdpi/ic_folder_grey600_24dp.png create mode 100755 core/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png create mode 100755 core/src/main/res/drawable-xxxhdpi/ic_folder_grey600_24dp.png create mode 100755 core/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png (limited to 'core/src') diff --git a/core/src/main/res/drawable-hdpi/ic_folder_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_folder_grey600_24dp.png new file mode 100755 index 000000000..e3dccd298 Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_folder_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_folder_white_24dp.png new file mode 100755 index 000000000..9f5c75609 Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_folder_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_folder_grey600_24dp.png new file mode 100755 index 000000000..1028bfaf3 Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_folder_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_folder_white_24dp.png new file mode 100755 index 000000000..1c5797c9e Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_folder_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_folder_grey600_24dp.png new file mode 100755 index 000000000..190df8236 Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png new file mode 100755 index 000000000..e5f54cef0 Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_folder_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_folder_grey600_24dp.png new file mode 100755 index 000000000..6fbc40459 Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png new file mode 100755 index 000000000..0d1ac4876 Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_folder_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_folder_grey600_24dp.png new file mode 100755 index 000000000..0107ea21c Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png new file mode 100755 index 000000000..7a3c198ee Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_folder_white_24dp.png differ diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 4ecf2cf61..28e390879 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -134,6 +134,7 @@ @string/all_episodes_label @string/downloads_label @string/playback_history_label + @string/my_subscriptions @string/add_feed_label diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index 2bdda2378..3923189ca 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -23,6 +23,7 @@ + diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index c6308fa7b..8cedc43b3 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ Log Cancel Download Playback history + Subscriptions gpodder.net gpodder.net login diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index 8619869c8..44e80da1d 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -37,6 +37,7 @@ @drawable/ic_more_vert_grey600_24dp @drawable/ic_new_releases_grey600_24dp @drawable/ic_history_grey600_24dp + @drawable/ic_folder_grey600_24dp @drawable/ic_play_arrow_grey600_36dp @drawable/ic_pause_grey600_36dp @drawable/ic_fast_forward_grey600_36dp @@ -82,6 +83,7 @@ @drawable/ic_more_vert_white_24dp @drawable/ic_new_releases_white_24dp @drawable/ic_history_white_24dp + @drawable/ic_folder_white_24dp @drawable/ic_play_arrow_white_36dp @drawable/ic_pause_white_36dp @drawable/ic_fast_forward_white_36dp @@ -130,6 +132,7 @@ @drawable/ic_more_vert_grey600_24dp @drawable/ic_new_releases_grey600_24dp @drawable/ic_history_grey600_24dp + @drawable/ic_folder_grey600_24dp @drawable/ic_play_arrow_grey600_36dp @drawable/ic_pause_grey600_36dp @drawable/ic_fast_forward_grey600_36dp @@ -177,6 +180,7 @@ @drawable/ic_more_vert_white_24dp @drawable/ic_new_releases_white_24dp @drawable/ic_history_white_24dp + @drawable/ic_folder_white_24dp @drawable/ic_play_arrow_white_36dp @drawable/ic_pause_white_36dp @drawable/ic_fast_forward_white_36dp -- cgit v1.2.3 From 9e09ad247b1cbb5dd19a630db4c55963dd714734 Mon Sep 17 00:00:00 2001 From: Raghul Date: Tue, 7 Jul 2015 12:00:10 +0800 Subject: Fix for title when image is not available --- core/src/main/res/values/dimens.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml index c46537b3e..2bd40f34a 100644 --- a/core/src/main/res/values/dimens.xml +++ b/core/src/main/res/values/dimens.xml @@ -30,6 +30,7 @@ 16dp 8dp + 8dp 16dp 16dp -- cgit v1.2.3 From 5e7ae6527c6574b1be43f22cce7438a3450de74b Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 13 Feb 2016 17:35:55 +0100 Subject: Try to handle all external media controls --- .../playback/PlaybackServiceMediaPlayer.java | 92 +++++++++++++++++----- 1 file changed, 71 insertions(+), 21 deletions(-) (limited to 'core/src') 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 a82e82506..783c0c6c8 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 @@ -1204,6 +1204,71 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre private static final String TAG = "MediaSessionCompat"; + @Override + public void onPlay() { + Log.d(TAG, "onPlay()"); + if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { + resume(); + } else if (playerStatus == PlayerStatus.INITIALIZED) { + setStartWhenPrepared(true); + prepare(); + } + } + + @Override + public void onPause() { + Log.d(TAG, "onPause()"); + if (playerStatus == PlayerStatus.PLAYING) { + pause(false, true); + } + if (UserPreferences.isPersistNotify()) { + pause(false, true); + } else { + pause(true, true); + } + } + + @Override + public void onStop() { + Log.d(TAG, "onStop()"); + stop(); + } + + @Override + public void onSkipToPrevious() { + Log.d(TAG, "onSkipToPrevious()"); + seekDelta(-UserPreferences.getRewindSecs() * 1000); + } + + @Override + public void onRewind() { + Log.d(TAG, "onRewind()"); + seekDelta(-UserPreferences.getRewindSecs() * 1000); + } + + @Override + public void onFastForward() { + Log.d(TAG, "onFastForward()"); + seekDelta(UserPreferences.getFastFowardSecs() * 1000); + } + + @Override + public void onSkipToNext() { + Log.d(TAG, "onSkipToNext()"); + if(UserPreferences.shouldHardwareButtonSkip()) { + endPlayback(true); + } else { + seekDelta(UserPreferences.getFastFowardSecs() * 1000); + } + } + + + @Override + public void onSeekTo(long pos) { + Log.d(TAG, "onSeekTo()"); + seekTo((int) pos); + } + @Override public boolean onMediaButtonEvent(final Intent mediaButton) { Log.d(TAG, "onMediaButtonEvent(" + mediaButton + ")"); @@ -1240,42 +1305,27 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return true; } case KeyEvent.KEYCODE_MEDIA_PLAY: { - Log.d(TAG, "Received Play event from RemoteControlClient"); - if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { - resume(); - } else if (playerStatus == PlayerStatus.INITIALIZED) { - setStartWhenPrepared(true); - prepare(); - } + sessionCallback.onPlay(); return true; } case KeyEvent.KEYCODE_MEDIA_PAUSE: { - Log.d(TAG, "Received Pause event from RemoteControlClient"); - if (playerStatus == PlayerStatus.PLAYING) { - pause(false, true); - } - if (UserPreferences.isPersistNotify()) { - pause(false, true); - } else { - pause(true, true); - } + sessionCallback.onPause(); return true; } case KeyEvent.KEYCODE_MEDIA_STOP: { - Log.d(TAG, "Received Stop event from RemoteControlClient"); - stop(); + sessionCallback.onStop(); return true; } case KeyEvent.KEYCODE_MEDIA_PREVIOUS: { - seekDelta(-UserPreferences.getRewindSecs() * 1000); + sessionCallback.onSkipToPrevious(); return true; } case KeyEvent.KEYCODE_MEDIA_REWIND: { - seekDelta(-UserPreferences.getRewindSecs() * 1000); + sessionCallback.onRewind(); return true; } case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: { - seekDelta(UserPreferences.getFastFowardSecs() * 1000); + sessionCallback.onFastForward(); return true; } case KeyEvent.KEYCODE_MEDIA_NEXT: { -- cgit v1.2.3 From 8f3f0c30c620548bb983624e311763306e95ae62 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 18 Feb 2016 08:38:57 +0100 Subject: Delay control hiding when button pressed --- .../core/util/playback/PlaybackController.java | 54 +++++++++++----------- 1 file changed, 26 insertions(+), 28 deletions(-) (limited to 'core/src') 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 27935978c..0a1a0540c 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 @@ -574,34 +574,32 @@ public abstract class PlaybackController { } - public OnClickListener newOnPlayButtonClickListener() { - return v -> { - if (playbackService == null) { - Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!"); - return; - } - switch (status) { - case PLAYING: - playbackService.pause(true, reinitOnPause); - break; - case PAUSED: - case PREPARED: - playbackService.resume(); - break; - case PREPARING: - playbackService.setStartWhenPrepared(!playbackService - .isStartWhenPrepared()); - if (reinitOnPause - && playbackService.isStartWhenPrepared() == false) { - playbackService.reinit(); - } - break; - case INITIALIZED: - playbackService.setStartWhenPrepared(true); - playbackService.prepare(); - break; - } - }; + public void playPause() { + if (playbackService == null) { + Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!"); + return; + } + switch (status) { + case PLAYING: + playbackService.pause(true, reinitOnPause); + break; + case PAUSED: + case PREPARED: + playbackService.resume(); + break; + case PREPARING: + playbackService.setStartWhenPrepared(!playbackService + .isStartWhenPrepared()); + if (reinitOnPause + && playbackService.isStartWhenPrepared() == false) { + playbackService.reinit(); + } + break; + case INITIALIZED: + playbackService.setStartWhenPrepared(true); + playbackService.prepare(); + break; + } } public boolean serviceAvailable() { -- cgit v1.2.3 From d818901b80fb29c6e80d553ef258e431696603c2 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 18 Feb 2016 08:40:15 +0100 Subject: Give it some time to read current position --- .../core/service/playback/PlaybackServiceMediaPlayer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'core/src') 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 a82e82506..d3a7fdee4 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 @@ -604,7 +604,11 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * Returns the position of the current media object or INVALID_TIME if the position could not be retrieved. */ public int getPosition() { - if (!playerLock.tryLock()) { + try { + if (!playerLock.tryLock(50, TimeUnit.MILLISECONDS)) { + return INVALID_TIME; + } + } catch (InterruptedException e) { return INVALID_TIME; } -- cgit v1.2.3 From 202f211230ad20bfc539fa5a5fff080e2e1ac623 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 18 Feb 2016 08:43:51 +0100 Subject: Also update position when paused --- .../de/danoeh/antennapod/core/util/playback/PlaybackController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/src') 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 0a1a0540c..1a011a90b 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 @@ -19,7 +19,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.view.SurfaceHolder; -import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; @@ -424,6 +423,7 @@ public abstract class PlaybackController { clearStatusMsg(); checkMediaInfoLoaded(); cancelPositionObserver(); + onPositionObserverUpdate(); updatePlayButtonAppearance(playResource, playText); if (PlaybackService.getCurrentMediaType() == MediaType.VIDEO) { setScreenOn(false); -- cgit v1.2.3 From acbda70e28b768b5977ec7a0ec63981b2aeeac16 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 19 Feb 2016 13:34:55 +0100 Subject: Make sure DB helpers and preferences are initialized --- .../de/danoeh/antennapod/core/ClientConfig.java | 22 +++++ .../de/danoeh/antennapod/core/UpdateManager.java | 97 ++++++++++++++++++++++ .../core/receiver/AlarmUpdateReceiver.java | 5 +- .../core/receiver/FeedUpdateReceiver.java | 2 + .../core/receiver/MediaButtonReceiver.java | 2 + 5 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java index 6619e706b..a96affb23 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java @@ -1,5 +1,12 @@ package de.danoeh.antennapod.core; +import android.content.Context; + +import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.core.util.NetworkUtils; + /** * Stores callbacks for core classes like Services, DB classes etc. and other configuration variables. * Apps using the core module of AntennaPod should register implementations of all interfaces here. @@ -22,4 +29,19 @@ public class ClientConfig { public static FlattrCallbacks flattrCallbacks; public static DBTasksCallbacks dbTasksCallbacks; + + private static boolean initialized = false; + + public static synchronized void initialize(Context context) { + if(initialized) { + return; + } + PodDBAdapter.init(context); + UserPreferences.init(context); + UpdateManager.init(context); + PlaybackPreferences.init(context); + NetworkUtils.init(context); + initialized = true; + } + } diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java new file mode 100644 index 000000000..8362c4a4e --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java @@ -0,0 +1,97 @@ +package de.danoeh.antennapod.core; + + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.util.Log; + +import org.antennapod.audio.MediaPlayer; + +import java.io.File; +import java.util.List; + +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; + +/* + * This class's job is do perform maintenance tasks whenever the app has been updated + */ +public class UpdateManager { + + public static final String TAG = UpdateManager.class.getSimpleName(); + + private static final String PREF_NAME = "app_version"; + private static final String KEY_VERSION_CODE = "version_code"; + + private static int currentVersionCode; + + private static Context context; + private static SharedPreferences prefs; + + public static void init(Context context) { + UpdateManager.context = context; + prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + PackageManager pm = context.getPackageManager(); + try { + PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); + currentVersionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Failed to obtain package info for package name: " + context.getPackageName(), e); + currentVersionCode = 0; + return; + } + final int oldVersionCode = getStoredVersionCode(); + Log.d(TAG, "old: " + oldVersionCode + ", current: " + currentVersionCode); + if(oldVersionCode < currentVersionCode) { + onUpgrade(oldVersionCode, currentVersionCode); + setCurrentVersionCode(); + } + } + + public static int getStoredVersionCode() { + return prefs.getInt(KEY_VERSION_CODE, -1); + } + + public static void setCurrentVersionCode() { + prefs.edit().putInt(KEY_VERSION_CODE, currentVersionCode).apply(); + } + + private static void onUpgrade(final int oldVersionCode, final int newVersionCode) { + if(oldVersionCode < 1030099) { + // delete the now obsolete image cache + // from now on, Glide will handle caching images + new Thread() { + public void run() { + List feeds = DBReader.getFeedList(); + for (Feed podcast : feeds) { + List episodes = DBReader.getFeedItemList(podcast); + for (FeedItem episode : episodes) { + FeedImage image = episode.getImage(); + if (image != null && image.isDownloaded() && image.getFile_url() != null) { + File imageFile = new File(image.getFile_url()); + if (imageFile.exists()) { + imageFile.delete(); + } + image.setFile_url(null); // calls setDownloaded(false) + DBWriter.setFeedImage(image); + } + } + } + } + }.start(); + } + if(oldVersionCode < 1050004) { + if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) { + UserPreferences.enableSonic(true); + } + } + } + +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java index ce5004a98..33c15883b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java @@ -6,7 +6,7 @@ import android.content.Intent; import android.text.TextUtils; import android.util.Log; -import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.preferences.UserPreferences; /** Listens for events that make it necessary to reset the update alarm. */ @@ -22,8 +22,7 @@ public class AlarmUpdateReceiver extends BroadcastReceiver { } else if (TextUtils.equals(intent.getAction(), Intent.ACTION_PACKAGE_REPLACED)) { Log.d(TAG, "Resetting update alarm after app upgrade"); } - PlaybackPreferences.init(context); - UserPreferences.init(context); + ClientConfig.initialize(context); UserPreferences.restartUpdateAlarm(false); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java index b959c7301..e0abe0efb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.util.Log; +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.NetworkUtils; @@ -19,6 +20,7 @@ public class FeedUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Received intent"); + ClientConfig.initialize(context); if (NetworkUtils.isDownloadAllowed()) { DBTasks.refreshAllFeeds(context, null); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java index a900248d2..568deb96c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.util.Log; import android.view.KeyEvent; import de.danoeh.antennapod.core.BuildConfig; +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.service.playback.PlaybackService; /** Receives media button events. */ @@ -21,6 +22,7 @@ public class MediaButtonReceiver extends BroadcastReceiver { KeyEvent event = (KeyEvent) intent.getExtras().get( Intent.EXTRA_KEY_EVENT); if (event.getAction() == KeyEvent.ACTION_DOWN) { + ClientConfig.initialize(context); Intent serviceIntent = new Intent(context, PlaybackService.class); int keycode = event.getKeyCode(); serviceIntent.putExtra(EXTRA_KEYCODE, keycode); -- cgit v1.2.3 From 16dd26a7e4617d9f8acbd4396014667be46f979f Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 19 Feb 2016 13:35:10 +0100 Subject: Refactor --- .../de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java index 568deb96c..51cc52e10 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java @@ -5,7 +5,7 @@ import android.content.Context; import android.content.Intent; import android.util.Log; import android.view.KeyEvent; -import de.danoeh.antennapod.core.BuildConfig; + import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.service.playback.PlaybackService; @@ -18,9 +18,8 @@ public class MediaButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - if (BuildConfig.DEBUG) Log.d(TAG, "Received intent"); - KeyEvent event = (KeyEvent) intent.getExtras().get( - Intent.EXTRA_KEY_EVENT); + Log.d(TAG, "Received intent"); + KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT); if (event.getAction() == KeyEvent.ACTION_DOWN) { ClientConfig.initialize(context); Intent serviceIntent = new Intent(context, PlaybackService.class); -- cgit v1.2.3 From e7cc82fdfb889493fbf9b56a32393019c78ccd72 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 20 Feb 2016 09:16:47 +0100 Subject: Make sure feed media is of the right content type --- .../antennapod/core/service/download/HttpDownloader.java | 10 ++++++++++ .../java/de/danoeh/antennapod/core/util/DownloadError.java | 3 ++- core/src/main/res/values/strings.xml | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) (limited to 'core/src') 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 e3a195253..a4ae3071c 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 @@ -27,6 +27,7 @@ import java.util.Date; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.util.DateUtils; import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.StorageUtils; @@ -117,6 +118,15 @@ public class HttpDownloader extends Downloader { throw e; } } + + if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + String contentType = response.header("Content-Type"); + if(!contentType.startsWith("audio/") && !contentType.startsWith("video/")) { + onFail(DownloadError.ERROR_FILE_TYPE, null); + return; + } + } + responseBody = response.body(); String contentEncodingHeader = response.header("Content-Encoding"); boolean isGzip = false; 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 602c221bf..d3f6c6b79 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 @@ -19,7 +19,8 @@ public enum DownloadError { ERROR_UNKNOWN_HOST(11, R.string.download_error_unknown_host), ERROR_REQUEST_ERROR(12, R.string.download_error_request_error), ERROR_DB_ACCESS_ERROR(13, R.string.download_error_db_access), - ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized); + ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized), + ERROR_FILE_TYPE(15, R.string.download_error_file_type_type); private final int code; private final int resId; diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 912a60f55..2dd69e26f 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -178,6 +178,7 @@ Connection Error Unknown Host Authentication Error + File Type Error Cancel all downloads Download canceled Download canceled\nDisabled Auto Download for this item -- cgit v1.2.3 From 13f5b09d56d5dd0e21a4e13f438e35ed3c7ebb19 Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Sat, 20 Feb 2016 09:02:50 -0500 Subject: fix the volume conversion upon user interaction move the conversion formula to a new method in core.util.Converter --- .../danoeh/antennapod/core/preferences/UserPreferences.java | 13 +++---------- .../main/java/de/danoeh/antennapod/core/util/Converter.java | 13 ++++++++++++- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'core/src') 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 6c0aff15e..293514ec7 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 @@ -29,6 +29,7 @@ import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; +import de.danoeh.antennapod.core.util.Converter; /** * Provides access to preferences set by the user in the settings screen. A @@ -260,20 +261,12 @@ public class UserPreferences { public static float getLeftVolume() { int volume = prefs.getInt(PREF_LEFT_VOLUME, 100); - if(volume == 100) { - return 1.0f; - } else { - return (float) (1 - (Math.log(100 - volume) / Math.log(100))); - } + return Converter.getVolumeFromPercentage(volume); } public static float getRightVolume() { int volume = prefs.getInt(PREF_RIGHT_VOLUME, 100); - if(volume == 100) { - return 1.0f; - } else { - return (float) (1 - (Math.log(100 - volume) / Math.log(100))); - } + return Converter.getVolumeFromPercentage(volume); } public static boolean shouldPauseForFocusLoss() { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java index 1b929b214..74fb9e709 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java @@ -118,5 +118,16 @@ public final class Converter { result += minutes; return result; } - + + /** + * Converts the volume as read as the progress from a SeekBar scaled to 100 and as saved in + * UserPreferences to the format taken by setVolume methods. + * @param progress integer between 0 to 100 taken from the SeekBar progress + * @return the appropriate volume as float taken by setVolume methods + */ + public static float getVolumeFromPercentage(int progress){ + if (progress==100) + return 1f; + return (float) (1 - (Math.log(101 - progress) / Math.log(101))); + } } -- cgit v1.2.3 From e980a7656c55a5ecb14e47ee9efa98492a570a97 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 20 Feb 2016 14:15:02 +0100 Subject: Duck and unduck done right --- .../core/service/playback/PlaybackServiceMediaPlayer.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'core/src') 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 a82e82506..20bdd1f75 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 @@ -693,7 +693,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } /** - * Sets the playback speed. + * Sets the playback volume. * This method is executed on an internal executor service. */ public void setVolume(final float volumeLeft, float volumeRight) { @@ -701,7 +701,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } /** - * Sets the playback speed. + * Sets the playback volume. * This method is executed on the caller's thread. */ private void setVolumeSync(float volumeLeft, float volumeRight) { @@ -946,15 +946,16 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre if (pausedBecauseOfTransientAudiofocusLoss) { // we paused => play now resume(); } else { // we ducked => raise audio level back - audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, - AudioManager.ADJUST_RAISE, 0); + setVolumeSync(UserPreferences.getLeftVolume(), + UserPreferences.getRightVolume()); } } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { if (playerStatus == PlayerStatus.PLAYING) { if (!UserPreferences.shouldPauseForFocusLoss()) { Log.d(TAG, "Lost audio focus temporarily. Ducking..."); - audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, - AudioManager.ADJUST_LOWER, 0); + final float DUCK_FACTOR = 0.25f; + setVolumeSync(DUCK_FACTOR * UserPreferences.getLeftVolume(), + DUCK_FACTOR * UserPreferences.getRightVolume()); pausedBecauseOfTransientAudiofocusLoss = false; } else { Log.d(TAG, "Lost audio focus temporarily. Could duck, but won't, pausing..."); -- cgit v1.2.3 From a8f27fa363d4e0cf9758a64714ffff7c19887c1e Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 20 Feb 2016 15:45:38 +0100 Subject: Downloader: Disable gzip for media files --- .../de/danoeh/antennapod/core/service/download/HttpDownloader.java | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'core/src') 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 e3a195253..e011fb994 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 @@ -27,6 +27,7 @@ import java.util.Date; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.util.DateUtils; import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.StorageUtils; @@ -67,6 +68,12 @@ public class HttpDownloader extends Downloader { final URI uri = URIUtil.getURIFromRequestUrl(request.getSource()); Request.Builder httpReq = new Request.Builder().url(uri.toURL()) .header("User-Agent", ClientConfig.USER_AGENT); + if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + // set header explicitly so that okhttp doesn't do transparent gzip + Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")"); + httpReq.addHeader("Accept-Encoding", "identity"); + } + if(!TextUtils.isEmpty(request.getLastModified())) { String lastModified = request.getLastModified(); Date lastModifiedDate = DateUtils.parse(lastModified); -- cgit v1.2.3 From c878bc4e873e686936fd0c16dccfb8d8f724c35d Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Sat, 20 Feb 2016 09:48:57 -0500 Subject: inicialize the volume SeekBars on audio controls to the values on UserPreferences --- .../de/danoeh/antennapod/core/preferences/UserPreferences.java | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'core/src') 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 293514ec7..14332922e 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 @@ -269,6 +269,14 @@ public class UserPreferences { return Converter.getVolumeFromPercentage(volume); } + public static int getLeftVolumePercentage() { + return prefs.getInt(PREF_LEFT_VOLUME, 100); + } + + public static int getRightVolumePercentage() { + return prefs.getInt(PREF_RIGHT_VOLUME, 100); + } + public static boolean shouldPauseForFocusLoss() { return prefs.getBoolean(PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS, false); } -- cgit v1.2.3 From 4fca673d1f6f9efbd5efc204b783e22947c9e12c Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 22 Feb 2016 07:52:46 +0100 Subject: OPML Import: Show dialog when no file has been selected --- core/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 912a60f55..e0146bef9 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -409,8 +409,8 @@ OPML Import ERROR! Reading OPML file - An error has occurred while reading the opml document: - The import directory is empty. + An error has occurred while reading the OPML document: + No file selected! Select all Deselect all Select… -- cgit v1.2.3 From 3c26c058f6f245d07e3a6b08bd6a898920edcec2 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 22 Feb 2016 11:01:12 +0100 Subject: Gpodder: Enable manual syncing --- core/src/main/res/values/strings.xml | 3 +++ 1 file changed, 3 insertions(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 912a60f55..d4891eee8 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -358,6 +358,9 @@ Logout was successful Change login information Change the login information for your gpodder.net account. + Sync now + Sync subscriptions and episode states with gpodder.net + Sync started Playback Speeds Customize the speeds available for variable speed audio playback Fast forward time -- cgit v1.2.3 From d4d8d18c5c63158de1ea0e1570f9258187ffa8fe Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 4 Mar 2016 12:07:26 +0100 Subject: Add ability to open feed after subscribing --- core/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 912a60f55..b64d7b073 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -134,6 +134,7 @@ Not downloaded Filtered {fa-exclamation-circle} Last Refresh failed + Open Podcast Download -- cgit v1.2.3 From fbbe94aceca7033282149b03a24d12c85397fcd6 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 9 Mar 2016 23:54:02 +0100 Subject: Delete unused resources --- .../core/util/gui/FeedItemUndoToken.java | 55 --------------------- .../drawable-hdpi/ic_description_grey600_36dp.png | Bin 425 -> 0 bytes .../drawable-hdpi/ic_description_white_36dp.png | Bin 424 -> 0 bytes .../drawable-hdpi/ic_more_vert_grey600_24dp.png | Bin 221 -> 0 bytes .../res/drawable-hdpi/ic_more_vert_white_24dp.png | Bin 219 -> 0 bytes core/src/main/res/drawable-hdpi/ic_new.png | Bin 891 -> 0 bytes core/src/main/res/drawable-hdpi/ic_new_dark.png | Bin 716 -> 0 bytes .../res/drawable-hdpi/ic_timer_grey600_24dp.png | Bin 640 -> 0 bytes .../main/res/drawable-hdpi/ic_timer_white_24dp.png | Bin 609 -> 0 bytes .../main/res/drawable-hdpi/ic_toc_grey600_36dp.png | Bin 229 -> 0 bytes .../main/res/drawable-hdpi/ic_toc_white_36dp.png | Bin 240 -> 0 bytes .../drawable-mdpi/ic_description_grey600_36dp.png | Bin 271 -> 0 bytes .../drawable-mdpi/ic_description_white_36dp.png | Bin 309 -> 0 bytes .../drawable-mdpi/ic_more_vert_grey600_24dp.png | Bin 202 -> 0 bytes .../res/drawable-mdpi/ic_more_vert_white_24dp.png | Bin 202 -> 0 bytes core/src/main/res/drawable-mdpi/ic_new.png | Bin 593 -> 0 bytes core/src/main/res/drawable-mdpi/ic_new_dark.png | Bin 484 -> 0 bytes .../res/drawable-mdpi/ic_timer_grey600_24dp.png | Bin 442 -> 0 bytes .../main/res/drawable-mdpi/ic_timer_white_24dp.png | Bin 420 -> 0 bytes .../main/res/drawable-mdpi/ic_toc_grey600_36dp.png | Bin 205 -> 0 bytes .../main/res/drawable-mdpi/ic_toc_white_36dp.png | Bin 205 -> 0 bytes .../drawable-xhdpi/ic_description_grey600_36dp.png | Bin 461 -> 0 bytes .../drawable-xhdpi/ic_description_white_36dp.png | Bin 459 -> 0 bytes .../drawable-xhdpi/ic_more_vert_grey600_24dp.png | Bin 252 -> 0 bytes .../res/drawable-xhdpi/ic_more_vert_white_24dp.png | Bin 269 -> 0 bytes core/src/main/res/drawable-xhdpi/ic_new.png | Bin 1189 -> 0 bytes core/src/main/res/drawable-xhdpi/ic_new_dark.png | Bin 989 -> 0 bytes .../res/drawable-xhdpi/ic_timer_grey600_24dp.png | Bin 761 -> 0 bytes .../res/drawable-xhdpi/ic_timer_white_24dp.png | Bin 810 -> 0 bytes .../res/drawable-xhdpi/ic_toc_grey600_36dp.png | Bin 222 -> 0 bytes .../main/res/drawable-xhdpi/ic_toc_white_36dp.png | Bin 229 -> 0 bytes .../main/res/drawable-xhdpi/ic_undobar_undo.png | Bin 1558 -> 0 bytes core/src/main/res/drawable-xhdpi/undobar.9.png | Bin 1665 -> 0 bytes .../drawable-xhdpi/undobar_button_focused.9.png | Bin 1141 -> 0 bytes .../drawable-xhdpi/undobar_button_pressed.9.png | Bin 1123 -> 0 bytes .../main/res/drawable-xhdpi/undobar_divider.9.png | Bin 963 -> 0 bytes .../ic_description_grey600_36dp.png | Bin 635 -> 0 bytes .../drawable-xxhdpi/ic_description_white_36dp.png | Bin 626 -> 0 bytes .../drawable-xxhdpi/ic_more_vert_grey600_24dp.png | Bin 316 -> 0 bytes .../drawable-xxhdpi/ic_more_vert_white_24dp.png | Bin 313 -> 0 bytes core/src/main/res/drawable-xxhdpi/ic_new.png | Bin 1759 -> 0 bytes core/src/main/res/drawable-xxhdpi/ic_new_dark.png | Bin 1501 -> 0 bytes .../res/drawable-xxhdpi/ic_timer_grey600_24dp.png | Bin 1074 -> 0 bytes .../res/drawable-xxhdpi/ic_timer_white_24dp.png | Bin 1063 -> 0 bytes .../res/drawable-xxhdpi/ic_toc_grey600_36dp.png | Bin 313 -> 0 bytes .../main/res/drawable-xxhdpi/ic_toc_white_36dp.png | Bin 312 -> 0 bytes core/src/main/res/drawable/undobar_button.xml | 22 --------- core/src/main/res/values/attrs.xml | 3 -- core/src/main/res/values/styles.xml | 12 ----- 49 files changed, 92 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java delete mode 100644 core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-hdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-hdpi/ic_new_dark.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-mdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-mdpi/ic_new_dark.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-xhdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-xhdpi/ic_new_dark.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_undobar_undo.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_divider.9.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-xxhdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-xxhdpi/ic_new_dark.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png delete mode 100644 core/src/main/res/drawable/undobar_button.xml (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java deleted file mode 100644 index 17581d3e9..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.danoeh.antennapod.core.util.gui; - -import android.os.Parcel; -import android.os.Parcelable; -import de.danoeh.antennapod.core.feed.FeedItem; - -/** - * Used by an UndoBarController for saving a removed FeedItem - */ -public class FeedItemUndoToken implements Parcelable { - private long itemId; - private long feedId; - private int position; - - public FeedItemUndoToken(FeedItem item, int position) { - this.itemId = item.getId(); - this.feedId = item.getFeed().getId(); - this.position = position; - } - - private FeedItemUndoToken(Parcel in) { - itemId = in.readLong(); - feedId = in.readLong(); - position = in.readInt(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public FeedItemUndoToken createFromParcel(Parcel in) { - return new FeedItemUndoToken(in); - } - - public FeedItemUndoToken[] newArray(int size) { - return new FeedItemUndoToken[size]; - } - }; - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel out, int flags) { - out.writeLong(itemId); - out.writeLong(feedId); - out.writeInt(position); - } - - public long getFeedItemId() { - return itemId; - } - - public int getPosition() { - return position; - } -} - diff --git a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png deleted file mode 100644 index dd7d0734d..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png deleted file mode 100644 index 93aa3032a..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index e141502a6..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index fdc4a5ad2..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_new.png b/core/src/main/res/drawable-hdpi/ic_new.png deleted file mode 100755 index 8ff519052..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_dark.png b/core/src/main/res/drawable-hdpi/ic_new_dark.png deleted file mode 100755 index c8581e01c..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index a5fdd2c40..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png deleted file mode 100644 index 864291fa7..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index e299eb41b..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png deleted file mode 100644 index bfdc05d9e..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png deleted file mode 100644 index ac18b5750..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png deleted file mode 100644 index f5612717f..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 4ed34354b..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 1d8ad18a0..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_new.png b/core/src/main/res/drawable-mdpi/ic_new.png deleted file mode 100755 index 84994bd10..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_dark.png b/core/src/main/res/drawable-mdpi/ic_new_dark.png deleted file mode 100755 index b723618b4..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index 186887c30..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png deleted file mode 100644 index 735ed7a00..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index 23bec7945..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png deleted file mode 100644 index dc03b34b9..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png deleted file mode 100644 index 50f854ea5..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png deleted file mode 100644 index 60d988dd4..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 7bc63a511..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 1b04eda04..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new.png b/core/src/main/res/drawable-xhdpi/ic_new.png deleted file mode 100755 index 447a9398b..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_dark.png b/core/src/main/res/drawable-xhdpi/ic_new_dark.png deleted file mode 100755 index 4a23d309c..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index 23149552f..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png deleted file mode 100644 index 896d9dcf2..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index 57a60ed9f..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png deleted file mode 100644 index aa7ee9c02..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png b/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png deleted file mode 100644 index 91c8429ad..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar.9.png b/core/src/main/res/drawable-xhdpi/undobar.9.png deleted file mode 100644 index 22fa2205b..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png deleted file mode 100644 index d284ca7cb..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png deleted file mode 100644 index e990659f0..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png b/core/src/main/res/drawable-xhdpi/undobar_divider.9.png deleted file mode 100644 index 1b067d4e7..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png deleted file mode 100644 index 33df5d9d2..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png deleted file mode 100644 index aa5e73299..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 44012b87d..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 2955c02ec..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new.png b/core/src/main/res/drawable-xxhdpi/ic_new.png deleted file mode 100755 index 5e836eae4..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png b/core/src/main/res/drawable-xxhdpi/ic_new_dark.png deleted file mode 100755 index bca96b751..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index a9ae43327..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png deleted file mode 100644 index 276f4e1b9..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index bb35c5657..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png deleted file mode 100644 index fdbb3ac3a..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable/undobar_button.xml b/core/src/main/res/drawable/undobar_button.xml deleted file mode 100644 index a4de91b49..000000000 --- a/core/src/main/res/drawable/undobar_button.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index 2d3379d95..74eef525a 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -19,8 +19,6 @@ - - @@ -29,7 +27,6 @@ - diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index d79ba6b45..27500b3e4 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -25,8 +25,6 @@ @drawable/ic_expand_more_grey600_36dp @drawable/ic_refresh_grey600_24dp @drawable/navigation_up - @drawable/ic_description_grey600_36dp - @drawable/ic_toc_grey600_36dp @drawable/ic_share_grey600_24dp @drawable/ic_list_grey600_24dp @drawable/ic_hearing_grey600_18dp @@ -37,7 +35,6 @@ @drawable/ic_drag_vertical_grey600_48dp @color/white @color/white - @drawable/ic_more_vert_grey600_24dp @drawable/ic_new_releases_grey600_24dp @drawable/ic_history_grey600_24dp @drawable/ic_play_arrow_grey600_36dp @@ -85,8 +82,6 @@ @drawable/ic_expand_more_white_36dp @drawable/ic_refresh_white_24dp @drawable/navigation_up_dark - @drawable/ic_description_white_36dp - @drawable/ic_toc_white_36dp @drawable/ic_share_white_24dp @drawable/ic_list_white_24dp @drawable/ic_hearing_white_18dp @@ -97,7 +92,6 @@ @drawable/ic_drag_vertical_white_48dp @color/black #3B3B3B - @drawable/ic_more_vert_white_24dp @drawable/ic_new_releases_white_24dp @drawable/ic_history_white_24dp @drawable/ic_play_arrow_white_36dp @@ -146,8 +140,6 @@ @drawable/ic_expand_more_grey600_36dp @drawable/ic_refresh_grey600_24dp @drawable/navigation_up - @drawable/ic_description_grey600_36dp - @drawable/ic_toc_grey600_36dp @drawable/ic_share_grey600_24dp @drawable/ic_list_grey600_24dp @drawable/ic_hearing_grey600_18dp @@ -158,7 +150,6 @@ @drawable/ic_drag_vertical_grey600_48dp @color/white @color/white - @drawable/ic_more_vert_grey600_24dp @drawable/ic_new_releases_grey600_24dp @drawable/ic_history_grey600_24dp @drawable/ic_play_arrow_grey600_36dp @@ -207,8 +198,6 @@ @drawable/ic_expand_more_white_36dp @drawable/ic_refresh_white_24dp @drawable/navigation_up_dark - @drawable/ic_description_white_36dp - @drawable/ic_toc_white_36dp @drawable/ic_share_white_24dp @drawable/ic_list_white_24dp @drawable/ic_hearing_white_18dp @@ -219,7 +208,6 @@ @drawable/ic_drag_vertical_white_48dp @color/black #3B3B3B - @drawable/ic_more_vert_white_24dp @drawable/ic_new_releases_white_24dp @drawable/ic_history_white_24dp @drawable/ic_play_arrow_white_36dp -- cgit v1.2.3 From d342b14ac00fae405be1f3615023ef4b8faa2f37 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 9 Mar 2016 23:55:17 +0100 Subject: Shrink resources (ImageOptim) --- .../drawable-hdpi-v11/ic_stat_antenna_default.png | Bin 678 -> 541 bytes .../res/drawable-hdpi-v11/ic_stat_authentication.png | Bin 467 -> 371 bytes .../main/res/drawable-hdpi/ic_add_grey600_24dp.png | Bin 222 -> 125 bytes .../src/main/res/drawable-hdpi/ic_add_white_24dp.png | Bin 223 -> 124 bytes .../res/drawable-hdpi/ic_av_fast_forward_80dp.png | Bin 1228 -> 429 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 3309 -> 1100 bytes .../drawable-hdpi/ic_av_play_circle_outline_80dp.png | Bin 3395 -> 1232 bytes .../src/main/res/drawable-hdpi/ic_av_rewind_80dp.png | Bin 1277 -> 408 bytes .../res/drawable-hdpi/ic_cancel_grey600_24dp.png | Bin 522 -> 415 bytes .../main/res/drawable-hdpi/ic_cancel_white_24dp.png | Bin 510 -> 394 bytes .../res/drawable-hdpi/ic_check_box_grey600_24dp.png | Bin 584 -> 278 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 397 -> 180 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 340 -> 170 bytes .../res/drawable-hdpi/ic_check_box_white_24dp.png | Bin 505 -> 260 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 198 -> 167 bytes .../ic_create_new_folder_white_24dp.png | Bin 191 -> 164 bytes .../res/drawable-hdpi/ic_delete_grey600_24dp.png | Bin 248 -> 161 bytes .../main/res/drawable-hdpi/ic_delete_white_24dp.png | Bin 246 -> 158 bytes .../main/res/drawable-hdpi/ic_done_grey600_24dp.png | Bin 326 -> 175 bytes .../main/res/drawable-hdpi/ic_done_white_24dp.png | Bin 309 -> 169 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 389 -> 289 bytes .../drawable-hdpi/ic_drag_vertical_white_48dp.9.png | Bin 361 -> 265 bytes .../drawable-hdpi/ic_expand_more_grey600_36dp.png | Bin 348 -> 195 bytes .../res/drawable-hdpi/ic_expand_more_white_36dp.png | Bin 324 -> 189 bytes .../drawable-hdpi/ic_fast_forward_grey600_24dp.png | Bin 366 -> 256 bytes .../drawable-hdpi/ic_fast_forward_grey600_36dp.png | Bin 460 -> 324 bytes .../res/drawable-hdpi/ic_fast_forward_white_24dp.png | Bin 360 -> 253 bytes .../res/drawable-hdpi/ic_fast_forward_white_36dp.png | Bin 451 -> 315 bytes .../drawable-hdpi/ic_fast_rewind_grey600_24dp.png | Bin 395 -> 267 bytes .../drawable-hdpi/ic_fast_rewind_grey600_36dp.png | Bin 480 -> 331 bytes .../res/drawable-hdpi/ic_fast_rewind_white_24dp.png | Bin 376 -> 261 bytes .../res/drawable-hdpi/ic_fast_rewind_white_36dp.png | Bin 461 -> 321 bytes .../main/res/drawable-hdpi/ic_feed_grey600_24dp.png | Bin 1159 -> 511 bytes .../main/res/drawable-hdpi/ic_feed_white_24dp.png | Bin 727 -> 458 bytes .../drawable-hdpi/ic_file_download_grey600_24dp.png | Bin 276 -> 154 bytes .../drawable-hdpi/ic_file_download_white_24dp.png | Bin 277 -> 150 bytes .../res/drawable-hdpi/ic_filter_grey600_24dp.png | Bin 135 -> 111 bytes .../main/res/drawable-hdpi/ic_filter_white_24dp.png | Bin 131 -> 110 bytes .../res/drawable-hdpi/ic_hearing_grey600_18dp.png | Bin 583 -> 478 bytes .../main/res/drawable-hdpi/ic_hearing_white_18dp.png | Bin 602 -> 449 bytes .../res/drawable-hdpi/ic_history_grey600_24dp.png | Bin 636 -> 509 bytes .../main/res/drawable-hdpi/ic_history_white_24dp.png | Bin 638 -> 511 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 405 -> 179 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 348 -> 171 bytes .../main/res/drawable-hdpi/ic_info_grey600_24dp.png | Bin 448 -> 342 bytes .../main/res/drawable-hdpi/ic_info_white_24dp.png | Bin 433 -> 325 bytes core/src/main/res/drawable-hdpi/ic_launcher.png | Bin 3955 -> 3887 bytes .../main/res/drawable-hdpi/ic_list_grey600_24dp.png | Bin 207 -> 115 bytes .../main/res/drawable-hdpi/ic_list_white_24dp.png | Bin 207 -> 114 bytes .../drawable-hdpi/ic_lock_closed_grey600_24dp.png | Bin 366 -> 315 bytes .../res/drawable-hdpi/ic_lock_closed_white_24dp.png | Bin 358 -> 303 bytes .../res/drawable-hdpi/ic_lock_open_grey600_24dp.png | Bin 362 -> 314 bytes .../res/drawable-hdpi/ic_lock_open_white_24dp.png | Bin 356 -> 299 bytes .../drawable-hdpi/ic_new_releases_grey600_24dp.png | Bin 501 -> 399 bytes .../res/drawable-hdpi/ic_new_releases_white_24dp.png | Bin 491 -> 381 bytes .../main/res/drawable-hdpi/ic_pause_grey600_24dp.png | Bin 188 -> 103 bytes .../main/res/drawable-hdpi/ic_pause_grey600_36dp.png | Bin 235 -> 126 bytes .../main/res/drawable-hdpi/ic_pause_white_24dp.png | Bin 188 -> 103 bytes .../main/res/drawable-hdpi/ic_pause_white_36dp.png | Bin 234 -> 124 bytes .../res/drawable-hdpi/ic_play_arrow_grey600_24dp.png | Bin 301 -> 195 bytes .../res/drawable-hdpi/ic_play_arrow_grey600_36dp.png | Bin 355 -> 235 bytes .../res/drawable-hdpi/ic_play_arrow_white_24dp.png | Bin 282 -> 194 bytes .../res/drawable-hdpi/ic_play_arrow_white_36dp.png | Bin 348 -> 232 bytes .../res/drawable-hdpi/ic_refresh_grey600_24dp.png | Bin 508 -> 407 bytes .../main/res/drawable-hdpi/ic_refresh_white_24dp.png | Bin 531 -> 367 bytes .../drawable-hdpi/ic_remove_red_eye_grey600_18dp.png | Bin 470 -> 380 bytes .../drawable-hdpi/ic_remove_red_eye_white_18dp.png | Bin 468 -> 358 bytes .../res/drawable-hdpi/ic_sd_storage_grey600_36dp.png | Bin 333 -> 259 bytes .../res/drawable-hdpi/ic_sd_storage_white_36dp.png | Bin 332 -> 247 bytes .../res/drawable-hdpi/ic_search_grey600_24dp.png | Bin 522 -> 412 bytes .../main/res/drawable-hdpi/ic_search_white_24dp.png | Bin 504 -> 386 bytes .../res/drawable-hdpi/ic_settings_grey600_24dp.png | Bin 572 -> 468 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 713 -> 569 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 703 -> 553 bytes .../res/drawable-hdpi/ic_settings_white_24dp.png | Bin 561 -> 438 bytes .../main/res/drawable-hdpi/ic_share_grey600_24dp.png | Bin 513 -> 413 bytes .../main/res/drawable-hdpi/ic_share_white_24dp.png | Bin 506 -> 382 bytes .../main/res/drawable-hdpi/ic_skip_grey600_36dp.png | Bin 302 -> 256 bytes .../main/res/drawable-hdpi/ic_skip_white_36dp.png | Bin 304 -> 251 bytes .../main/res/drawable-hdpi/ic_sleep_grey600_24dp.png | Bin 421 -> 180 bytes .../res/drawable-hdpi/ic_sleep_off_grey600_24dp.png | Bin 659 -> 290 bytes .../res/drawable-hdpi/ic_sleep_off_white_24dp.png | Bin 431 -> 264 bytes .../main/res/drawable-hdpi/ic_sleep_white_24dp.png | Bin 361 -> 179 bytes .../main/res/drawable-hdpi/ic_sort_grey600_24dp.png | Bin 264 -> 118 bytes .../main/res/drawable-hdpi/ic_sort_white_24dp.png | Bin 238 -> 114 bytes .../drawable-hdpi/ic_star_border_grey600_24dp.png | Bin 637 -> 530 bytes .../res/drawable-hdpi/ic_star_border_white_24dp.png | Bin 637 -> 488 bytes .../main/res/drawable-hdpi/ic_star_grey600_24dp.png | Bin 460 -> 389 bytes .../main/res/drawable-hdpi/ic_star_white_24dp.png | Bin 454 -> 369 bytes .../res/drawable-hdpi/ic_stat_antenna_default.png | Bin 649 -> 473 bytes .../res/drawable-hdpi/ic_stat_authentication.png | Bin 648 -> 446 bytes .../main/res/drawable-hdpi/ic_web_grey600_24dp.png | Bin 248 -> 162 bytes .../src/main/res/drawable-hdpi/ic_web_white_24dp.png | Bin 245 -> 159 bytes .../src/main/res/drawable-hdpi/ic_widget_preview.png | Bin 18320 -> 8210 bytes core/src/main/res/drawable-hdpi/navigation_up.png | Bin 2270 -> 318 bytes .../main/res/drawable-hdpi/navigation_up_dark.png | Bin 2221 -> 309 bytes core/src/main/res/drawable-hdpi/stat_notify_sync.png | Bin 421 -> 333 bytes .../res/drawable-hdpi/stat_notify_sync_error.png | Bin 436 -> 352 bytes .../drawable-ldpi-v11/ic_stat_antenna_default.png | Bin 307 -> 259 bytes core/src/main/res/drawable-ldpi/ic_launcher.png | Bin 1658 -> 1645 bytes .../res/drawable-ldpi/ic_stat_antenna_default.png | Bin 271 -> 202 bytes .../drawable-mdpi-v11/ic_stat_antenna_default.png | Bin 414 -> 349 bytes .../res/drawable-mdpi-v11/ic_stat_authentication.png | Bin 293 -> 244 bytes .../main/res/drawable-mdpi/ic_add_grey600_24dp.png | Bin 174 -> 90 bytes .../src/main/res/drawable-mdpi/ic_add_white_24dp.png | Bin 174 -> 88 bytes .../res/drawable-mdpi/ic_av_fast_forward_80dp.png | Bin 760 -> 328 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 1765 -> 768 bytes .../drawable-mdpi/ic_av_play_circle_outline_80dp.png | Bin 1858 -> 820 bytes .../src/main/res/drawable-mdpi/ic_av_rewind_80dp.png | Bin 853 -> 349 bytes .../res/drawable-mdpi/ic_cancel_grey600_24dp.png | Bin 401 -> 307 bytes .../main/res/drawable-mdpi/ic_cancel_white_24dp.png | Bin 393 -> 290 bytes .../res/drawable-mdpi/ic_check_box_grey600_24dp.png | Bin 397 -> 193 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 254 -> 116 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 230 -> 113 bytes .../res/drawable-mdpi/ic_check_box_white_24dp.png | Bin 331 -> 179 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 152 -> 133 bytes .../ic_create_new_folder_white_24dp.png | Bin 149 -> 132 bytes .../res/drawable-mdpi/ic_delete_grey600_24dp.png | Bin 199 -> 114 bytes .../main/res/drawable-mdpi/ic_delete_white_24dp.png | Bin 197 -> 112 bytes .../main/res/drawable-mdpi/ic_done_grey600_24dp.png | Bin 244 -> 132 bytes .../main/res/drawable-mdpi/ic_done_white_24dp.png | Bin 243 -> 133 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 253 -> 202 bytes .../drawable-mdpi/ic_drag_vertical_white_48dp.9.png | Bin 231 -> 191 bytes .../drawable-mdpi/ic_expand_more_grey600_36dp.png | Bin 291 -> 160 bytes .../res/drawable-mdpi/ic_expand_more_white_36dp.png | Bin 290 -> 153 bytes .../drawable-mdpi/ic_fast_forward_grey600_24dp.png | Bin 276 -> 162 bytes .../drawable-mdpi/ic_fast_forward_grey600_36dp.png | Bin 366 -> 256 bytes .../res/drawable-mdpi/ic_fast_forward_white_24dp.png | Bin 265 -> 163 bytes .../res/drawable-mdpi/ic_fast_forward_white_36dp.png | Bin 360 -> 253 bytes .../drawable-mdpi/ic_fast_rewind_grey600_24dp.png | Bin 267 -> 167 bytes .../drawable-mdpi/ic_fast_rewind_grey600_36dp.png | Bin 395 -> 267 bytes .../res/drawable-mdpi/ic_fast_rewind_white_24dp.png | Bin 263 -> 162 bytes .../res/drawable-mdpi/ic_fast_rewind_white_36dp.png | Bin 376 -> 261 bytes .../main/res/drawable-mdpi/ic_feed_grey600_24dp.png | Bin 773 -> 353 bytes .../main/res/drawable-mdpi/ic_feed_white_24dp.png | Bin 492 -> 321 bytes .../drawable-mdpi/ic_file_download_grey600_24dp.png | Bin 213 -> 115 bytes .../drawable-mdpi/ic_file_download_white_24dp.png | Bin 210 -> 113 bytes .../res/drawable-mdpi/ic_filter_grey600_24dp.png | Bin 111 -> 91 bytes .../main/res/drawable-mdpi/ic_filter_white_24dp.png | Bin 111 -> 90 bytes .../res/drawable-mdpi/ic_hearing_grey600_18dp.png | Bin 408 -> 324 bytes .../main/res/drawable-mdpi/ic_hearing_white_18dp.png | Bin 397 -> 301 bytes .../res/drawable-mdpi/ic_history_grey600_24dp.png | Bin 447 -> 345 bytes .../main/res/drawable-mdpi/ic_history_white_24dp.png | Bin 447 -> 345 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 259 -> 118 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 241 -> 115 bytes .../main/res/drawable-mdpi/ic_info_grey600_24dp.png | Bin 327 -> 233 bytes .../main/res/drawable-mdpi/ic_info_white_24dp.png | Bin 319 -> 224 bytes core/src/main/res/drawable-mdpi/ic_launcher.png | Bin 2382 -> 2359 bytes .../main/res/drawable-mdpi/ic_list_grey600_24dp.png | Bin 178 -> 88 bytes .../main/res/drawable-mdpi/ic_list_white_24dp.png | Bin 171 -> 86 bytes .../drawable-mdpi/ic_lock_closed_grey600_24dp.png | Bin 242 -> 205 bytes .../res/drawable-mdpi/ic_lock_closed_white_24dp.png | Bin 237 -> 199 bytes .../res/drawable-mdpi/ic_lock_open_grey600_24dp.png | Bin 242 -> 208 bytes .../res/drawable-mdpi/ic_lock_open_white_24dp.png | Bin 238 -> 198 bytes .../drawable-mdpi/ic_new_releases_grey600_24dp.png | Bin 382 -> 288 bytes .../res/drawable-mdpi/ic_new_releases_white_24dp.png | Bin 378 -> 277 bytes .../main/res/drawable-mdpi/ic_pause_grey600_24dp.png | Bin 168 -> 84 bytes .../main/res/drawable-mdpi/ic_pause_grey600_36dp.png | Bin 188 -> 103 bytes .../main/res/drawable-mdpi/ic_pause_white_24dp.png | Bin 174 -> 83 bytes .../main/res/drawable-mdpi/ic_pause_white_36dp.png | Bin 188 -> 103 bytes .../res/drawable-mdpi/ic_play_arrow_grey600_24dp.png | Bin 248 -> 151 bytes .../res/drawable-mdpi/ic_play_arrow_grey600_36dp.png | Bin 301 -> 195 bytes .../res/drawable-mdpi/ic_play_arrow_white_24dp.png | Bin 257 -> 154 bytes .../res/drawable-mdpi/ic_play_arrow_white_36dp.png | Bin 282 -> 194 bytes .../res/drawable-mdpi/ic_refresh_grey600_24dp.png | Bin 356 -> 261 bytes .../main/res/drawable-mdpi/ic_refresh_white_24dp.png | Bin 346 -> 247 bytes .../drawable-mdpi/ic_remove_red_eye_grey600_18dp.png | Bin 357 -> 265 bytes .../drawable-mdpi/ic_remove_red_eye_white_18dp.png | Bin 371 -> 259 bytes .../res/drawable-mdpi/ic_sd_storage_grey600_36dp.png | Bin 220 -> 181 bytes .../res/drawable-mdpi/ic_sd_storage_white_36dp.png | Bin 214 -> 172 bytes .../res/drawable-mdpi/ic_search_grey600_24dp.png | Bin 356 -> 263 bytes .../main/res/drawable-mdpi/ic_search_white_24dp.png | Bin 346 -> 247 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 491 -> 388 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 473 -> 371 bytes .../main/res/drawable-mdpi/ic_share_grey600_24dp.png | Bin 371 -> 269 bytes .../main/res/drawable-mdpi/ic_share_white_24dp.png | Bin 361 -> 261 bytes .../main/res/drawable-mdpi/ic_skip_grey600_36dp.png | Bin 218 -> 183 bytes .../main/res/drawable-mdpi/ic_skip_white_36dp.png | Bin 216 -> 183 bytes .../main/res/drawable-mdpi/ic_sleep_grey600_24dp.png | Bin 336 -> 140 bytes .../res/drawable-mdpi/ic_sleep_off_grey600_24dp.png | Bin 472 -> 225 bytes .../res/drawable-mdpi/ic_sleep_off_white_24dp.png | Bin 323 -> 203 bytes .../main/res/drawable-mdpi/ic_sleep_white_24dp.png | Bin 252 -> 139 bytes .../main/res/drawable-mdpi/ic_sort_grey600_24dp.png | Bin 193 -> 91 bytes .../main/res/drawable-mdpi/ic_sort_white_24dp.png | Bin 192 -> 90 bytes .../drawable-mdpi/ic_star_border_grey600_24dp.png | Bin 410 -> 354 bytes .../res/drawable-mdpi/ic_star_border_white_24dp.png | Bin 410 -> 342 bytes .../main/res/drawable-mdpi/ic_star_grey600_24dp.png | Bin 307 -> 274 bytes .../main/res/drawable-mdpi/ic_star_white_24dp.png | Bin 302 -> 265 bytes .../res/drawable-mdpi/ic_stat_antenna_default.png | Bin 412 -> 297 bytes .../res/drawable-mdpi/ic_stat_authentication.png | Bin 460 -> 317 bytes .../main/res/drawable-mdpi/ic_web_grey600_24dp.png | Bin 212 -> 123 bytes .../src/main/res/drawable-mdpi/ic_web_white_24dp.png | Bin 211 -> 122 bytes core/src/main/res/drawable-mdpi/navigation_up.png | Bin 2123 -> 279 bytes .../main/res/drawable-mdpi/navigation_up_dark.png | Bin 2060 -> 267 bytes core/src/main/res/drawable-mdpi/stat_notify_sync.png | Bin 272 -> 227 bytes .../res/drawable-mdpi/stat_notify_sync_error.png | Bin 274 -> 241 bytes .../drawable-xhdpi-v11/ic_stat_antenna_default.png | Bin 1005 -> 783 bytes .../drawable-xhdpi-v11/ic_stat_authentication.png | Bin 529 -> 418 bytes .../main/res/drawable-xhdpi/ic_add_grey600_24dp.png | Bin 199 -> 109 bytes .../main/res/drawable-xhdpi/ic_add_white_24dp.png | Bin 198 -> 97 bytes .../res/drawable-xhdpi/ic_av_fast_forward_80dp.png | Bin 1968 -> 575 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 5191 -> 1889 bytes .../ic_av_play_circle_outline_80dp.png | Bin 5393 -> 1994 bytes .../main/res/drawable-xhdpi/ic_av_rewind_80dp.png | Bin 1992 -> 603 bytes .../res/drawable-xhdpi/ic_cancel_grey600_24dp.png | Bin 661 -> 537 bytes .../main/res/drawable-xhdpi/ic_cancel_white_24dp.png | Bin 645 -> 513 bytes .../res/drawable-xhdpi/ic_check_box_grey600_24dp.png | Bin 658 -> 305 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 406 -> 186 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 364 -> 165 bytes .../res/drawable-xhdpi/ic_check_box_white_24dp.png | Bin 526 -> 282 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 248 -> 198 bytes .../ic_create_new_folder_white_24dp.png | Bin 239 -> 188 bytes .../res/drawable-xhdpi/ic_delete_grey600_24dp.png | Bin 271 -> 153 bytes .../main/res/drawable-xhdpi/ic_delete_white_24dp.png | Bin 270 -> 146 bytes .../main/res/drawable-xhdpi/ic_done_grey600_24dp.png | Bin 373 -> 189 bytes .../main/res/drawable-xhdpi/ic_done_white_24dp.png | Bin 363 -> 183 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 548 -> 379 bytes .../drawable-xhdpi/ic_drag_vertical_white_48dp.9.png | Bin 517 -> 349 bytes .../drawable-xhdpi/ic_expand_more_grey600_36dp.png | Bin 411 -> 223 bytes .../res/drawable-xhdpi/ic_expand_more_white_36dp.png | Bin 406 -> 218 bytes .../drawable-xhdpi/ic_fast_forward_grey600_24dp.png | Bin 383 -> 252 bytes .../drawable-xhdpi/ic_fast_forward_grey600_36dp.png | Bin 497 -> 332 bytes .../drawable-xhdpi/ic_fast_forward_white_24dp.png | Bin 386 -> 253 bytes .../drawable-xhdpi/ic_fast_forward_white_36dp.png | Bin 496 -> 327 bytes .../drawable-xhdpi/ic_fast_rewind_grey600_24dp.png | Bin 405 -> 279 bytes .../drawable-xhdpi/ic_fast_rewind_grey600_36dp.png | Bin 523 -> 348 bytes .../res/drawable-xhdpi/ic_fast_rewind_white_24dp.png | Bin 399 -> 263 bytes .../res/drawable-xhdpi/ic_fast_rewind_white_36dp.png | Bin 511 -> 331 bytes .../main/res/drawable-xhdpi/ic_feed_grey600_24dp.png | Bin 1420 -> 645 bytes .../main/res/drawable-xhdpi/ic_feed_white_24dp.png | Bin 910 -> 572 bytes .../drawable-xhdpi/ic_file_download_grey600_24dp.png | Bin 283 -> 148 bytes .../drawable-xhdpi/ic_file_download_white_24dp.png | Bin 282 -> 143 bytes .../res/drawable-xhdpi/ic_filter_grey600_24dp.png | Bin 141 -> 106 bytes .../main/res/drawable-xhdpi/ic_filter_white_24dp.png | Bin 141 -> 103 bytes .../res/drawable-xhdpi/ic_hearing_grey600_18dp.png | Bin 759 -> 621 bytes .../res/drawable-xhdpi/ic_hearing_white_18dp.png | Bin 724 -> 588 bytes .../res/drawable-xhdpi/ic_history_grey600_24dp.png | Bin 769 -> 636 bytes .../res/drawable-xhdpi/ic_history_white_24dp.png | Bin 770 -> 634 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 407 -> 186 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 370 -> 166 bytes .../main/res/drawable-xhdpi/ic_info_grey600_24dp.png | Bin 547 -> 428 bytes .../main/res/drawable-xhdpi/ic_info_white_24dp.png | Bin 530 -> 411 bytes core/src/main/res/drawable-xhdpi/ic_launcher.png | Bin 5589 -> 5519 bytes .../main/res/drawable-xhdpi/ic_list_grey600_24dp.png | Bin 197 -> 104 bytes .../main/res/drawable-xhdpi/ic_list_white_24dp.png | Bin 196 -> 95 bytes .../drawable-xhdpi/ic_lock_closed_grey600_24dp.png | Bin 430 -> 355 bytes .../res/drawable-xhdpi/ic_lock_closed_white_24dp.png | Bin 421 -> 341 bytes .../res/drawable-xhdpi/ic_lock_open_grey600_24dp.png | Bin 427 -> 355 bytes .../res/drawable-xhdpi/ic_lock_open_white_24dp.png | Bin 420 -> 341 bytes .../drawable-xhdpi/ic_new_releases_grey600_24dp.png | Bin 623 -> 496 bytes .../drawable-xhdpi/ic_new_releases_white_24dp.png | Bin 637 -> 464 bytes .../res/drawable-xhdpi/ic_pause_grey600_24dp.png | Bin 193 -> 105 bytes .../res/drawable-xhdpi/ic_pause_grey600_36dp.png | Bin 217 -> 109 bytes .../main/res/drawable-xhdpi/ic_pause_white_24dp.png | Bin 193 -> 90 bytes .../main/res/drawable-xhdpi/ic_pause_white_36dp.png | Bin 215 -> 92 bytes .../drawable-xhdpi/ic_play_arrow_grey600_24dp.png | Bin 319 -> 211 bytes .../drawable-xhdpi/ic_play_arrow_grey600_36dp.png | Bin 400 -> 270 bytes .../res/drawable-xhdpi/ic_play_arrow_white_24dp.png | Bin 318 -> 206 bytes .../res/drawable-xhdpi/ic_play_arrow_white_36dp.png | Bin 399 -> 270 bytes .../res/drawable-xhdpi/ic_refresh_grey600_24dp.png | Bin 644 -> 511 bytes .../res/drawable-xhdpi/ic_refresh_white_24dp.png | Bin 637 -> 484 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 589 -> 492 bytes .../drawable-xhdpi/ic_remove_red_eye_white_18dp.png | Bin 585 -> 472 bytes .../drawable-xhdpi/ic_sd_storage_grey600_36dp.png | Bin 403 -> 295 bytes .../res/drawable-xhdpi/ic_sd_storage_white_36dp.png | Bin 404 -> 284 bytes .../res/drawable-xhdpi/ic_search_grey600_24dp.png | Bin 597 -> 483 bytes .../main/res/drawable-xhdpi/ic_search_white_24dp.png | Bin 591 -> 453 bytes .../res/drawable-xhdpi/ic_settings_grey600_24dp.png | Bin 704 -> 581 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 834 -> 698 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 825 -> 675 bytes .../res/drawable-xhdpi/ic_settings_white_24dp.png | Bin 737 -> 540 bytes .../res/drawable-xhdpi/ic_share_grey600_24dp.png | Bin 629 -> 496 bytes .../main/res/drawable-xhdpi/ic_share_white_24dp.png | Bin 625 -> 472 bytes .../main/res/drawable-xhdpi/ic_skip_grey600_36dp.png | Bin 364 -> 285 bytes .../main/res/drawable-xhdpi/ic_skip_white_36dp.png | Bin 368 -> 285 bytes .../res/drawable-xhdpi/ic_sleep_grey600_24dp.png | Bin 494 -> 224 bytes .../res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png | Bin 769 -> 358 bytes .../res/drawable-xhdpi/ic_sleep_off_white_24dp.png | Bin 486 -> 326 bytes .../main/res/drawable-xhdpi/ic_sleep_white_24dp.png | Bin 367 -> 208 bytes .../main/res/drawable-xhdpi/ic_sort_grey600_24dp.png | Bin 215 -> 106 bytes .../main/res/drawable-xhdpi/ic_sort_white_24dp.png | Bin 212 -> 101 bytes .../drawable-xhdpi/ic_star_border_grey600_24dp.png | Bin 828 -> 694 bytes .../res/drawable-xhdpi/ic_star_border_white_24dp.png | Bin 821 -> 630 bytes .../main/res/drawable-xhdpi/ic_star_grey600_24dp.png | Bin 593 -> 487 bytes .../main/res/drawable-xhdpi/ic_star_white_24dp.png | Bin 582 -> 455 bytes .../res/drawable-xhdpi/ic_stat_antenna_default.png | Bin 942 -> 693 bytes .../res/drawable-xhdpi/ic_stat_authentication.png | Bin 882 -> 584 bytes .../main/res/drawable-xhdpi/ic_web_grey600_24dp.png | Bin 282 -> 190 bytes .../main/res/drawable-xhdpi/ic_web_white_24dp.png | Bin 319 -> 182 bytes core/src/main/res/drawable-xhdpi/navigation_up.png | Bin 2471 -> 409 bytes .../main/res/drawable-xhdpi/navigation_up_dark.png | Bin 2445 -> 408 bytes .../src/main/res/drawable-xhdpi/stat_notify_sync.png | Bin 475 -> 368 bytes .../res/drawable-xhdpi/stat_notify_sync_error.png | Bin 533 -> 415 bytes .../main/res/drawable-xxhdpi/ic_add_grey600_24dp.png | Bin 223 -> 114 bytes .../main/res/drawable-xxhdpi/ic_add_white_24dp.png | Bin 222 -> 97 bytes .../res/drawable-xxhdpi/ic_av_fast_forward_80dp.png | Bin 3207 -> 831 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 8059 -> 2745 bytes .../ic_av_play_circle_outline_80dp.png | Bin 8216 -> 2987 bytes .../main/res/drawable-xxhdpi/ic_av_rewind_80dp.png | Bin 3502 -> 757 bytes .../res/drawable-xxhdpi/ic_cancel_grey600_24dp.png | Bin 920 -> 756 bytes .../res/drawable-xxhdpi/ic_cancel_white_24dp.png | Bin 893 -> 716 bytes .../drawable-xxhdpi/ic_check_box_grey600_24dp.png | Bin 920 -> 415 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 582 -> 244 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 502 -> 214 bytes .../res/drawable-xxhdpi/ic_check_box_white_24dp.png | Bin 800 -> 383 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 343 -> 262 bytes .../ic_create_new_folder_white_24dp.png | Bin 339 -> 251 bytes .../res/drawable-xxhdpi/ic_delete_grey600_24dp.png | Bin 341 -> 195 bytes .../res/drawable-xxhdpi/ic_delete_white_24dp.png | Bin 338 -> 189 bytes .../res/drawable-xxhdpi/ic_done_grey600_24dp.png | Bin 451 -> 262 bytes .../main/res/drawable-xxhdpi/ic_done_white_24dp.png | Bin 476 -> 252 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 853 -> 593 bytes .../ic_drag_vertical_white_48dp.9.png | Bin 809 -> 544 bytes .../drawable-xxhdpi/ic_expand_more_grey600_36dp.png | Bin 539 -> 278 bytes .../drawable-xxhdpi/ic_expand_more_white_36dp.png | Bin 539 -> 273 bytes .../drawable-xxhdpi/ic_fast_forward_grey600_24dp.png | Bin 497 -> 332 bytes .../drawable-xxhdpi/ic_fast_forward_grey600_36dp.png | Bin 689 -> 520 bytes .../drawable-xxhdpi/ic_fast_forward_white_24dp.png | Bin 496 -> 327 bytes .../drawable-xxhdpi/ic_fast_forward_white_36dp.png | Bin 689 -> 518 bytes .../drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png | Bin 523 -> 348 bytes .../drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png | Bin 704 -> 547 bytes .../drawable-xxhdpi/ic_fast_rewind_white_24dp.png | Bin 511 -> 331 bytes .../drawable-xxhdpi/ic_fast_rewind_white_36dp.png | Bin 708 -> 548 bytes .../res/drawable-xxhdpi/ic_feed_grey600_24dp.png | Bin 2087 -> 956 bytes .../main/res/drawable-xxhdpi/ic_feed_white_24dp.png | Bin 1366 -> 843 bytes .../ic_file_download_grey600_24dp.png | Bin 353 -> 182 bytes .../drawable-xxhdpi/ic_file_download_white_24dp.png | Bin 351 -> 177 bytes .../res/drawable-xxhdpi/ic_filter_grey600_24dp.png | Bin 189 -> 114 bytes .../res/drawable-xxhdpi/ic_filter_white_24dp.png | Bin 188 -> 107 bytes .../res/drawable-xxhdpi/ic_hearing_grey600_18dp.png | Bin 1041 -> 885 bytes .../res/drawable-xxhdpi/ic_hearing_white_18dp.png | Bin 1034 -> 840 bytes .../res/drawable-xxhdpi/ic_history_grey600_24dp.png | Bin 1121 -> 950 bytes .../res/drawable-xxhdpi/ic_history_white_24dp.png | Bin 1123 -> 952 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 580 -> 247 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 514 -> 219 bytes .../res/drawable-xxhdpi/ic_info_grey600_24dp.png | Bin 762 -> 611 bytes .../main/res/drawable-xxhdpi/ic_info_white_24dp.png | Bin 736 -> 576 bytes core/src/main/res/drawable-xxhdpi/ic_launcher.png | Bin 14262 -> 9483 bytes .../res/drawable-xxhdpi/ic_list_grey600_24dp.png | Bin 223 -> 111 bytes .../main/res/drawable-xxhdpi/ic_list_white_24dp.png | Bin 230 -> 94 bytes .../drawable-xxhdpi/ic_lock_closed_grey600_24dp.png | Bin 630 -> 518 bytes .../drawable-xxhdpi/ic_lock_closed_white_24dp.png | Bin 621 -> 494 bytes .../drawable-xxhdpi/ic_lock_open_grey600_24dp.png | Bin 627 -> 519 bytes .../res/drawable-xxhdpi/ic_lock_open_white_24dp.png | Bin 621 -> 496 bytes .../drawable-xxhdpi/ic_new_releases_grey600_24dp.png | Bin 881 -> 718 bytes .../drawable-xxhdpi/ic_new_releases_white_24dp.png | Bin 858 -> 679 bytes .../res/drawable-xxhdpi/ic_pause_grey600_24dp.png | Bin 217 -> 109 bytes .../res/drawable-xxhdpi/ic_pause_grey600_36dp.png | Bin 294 -> 143 bytes .../main/res/drawable-xxhdpi/ic_pause_white_24dp.png | Bin 215 -> 92 bytes .../main/res/drawable-xxhdpi/ic_pause_white_36dp.png | Bin 293 -> 143 bytes .../drawable-xxhdpi/ic_play_arrow_grey600_24dp.png | Bin 400 -> 270 bytes .../drawable-xxhdpi/ic_play_arrow_grey600_36dp.png | Bin 544 -> 367 bytes .../res/drawable-xxhdpi/ic_play_arrow_white_24dp.png | Bin 399 -> 270 bytes .../res/drawable-xxhdpi/ic_play_arrow_white_36dp.png | Bin 543 -> 351 bytes .../res/drawable-xxhdpi/ic_refresh_grey600_24dp.png | Bin 882 -> 741 bytes .../res/drawable-xxhdpi/ic_refresh_white_24dp.png | Bin 875 -> 689 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 826 -> 697 bytes .../drawable-xxhdpi/ic_remove_red_eye_white_18dp.png | Bin 862 -> 669 bytes .../drawable-xxhdpi/ic_sd_storage_grey600_36dp.png | Bin 605 -> 439 bytes .../res/drawable-xxhdpi/ic_sd_storage_white_36dp.png | Bin 593 -> 416 bytes .../res/drawable-xxhdpi/ic_search_grey600_24dp.png | Bin 881 -> 712 bytes .../res/drawable-xxhdpi/ic_search_white_24dp.png | Bin 871 -> 669 bytes .../res/drawable-xxhdpi/ic_settings_grey600_24dp.png | Bin 994 -> 844 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 1231 -> 1063 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 1219 -> 1019 bytes .../res/drawable-xxhdpi/ic_settings_white_24dp.png | Bin 974 -> 790 bytes .../res/drawable-xxhdpi/ic_share_grey600_24dp.png | Bin 866 -> 694 bytes .../main/res/drawable-xxhdpi/ic_share_white_24dp.png | Bin 857 -> 660 bytes .../res/drawable-xxhdpi/ic_skip_grey600_36dp.png | Bin 533 -> 369 bytes .../main/res/drawable-xxhdpi/ic_skip_white_36dp.png | Bin 543 -> 361 bytes .../res/drawable-xxhdpi/ic_sleep_grey600_24dp.png | Bin 737 -> 311 bytes .../drawable-xxhdpi/ic_sleep_off_grey600_24dp.png | Bin 1113 -> 495 bytes .../res/drawable-xxhdpi/ic_sleep_off_white_24dp.png | Bin 664 -> 449 bytes .../main/res/drawable-xxhdpi/ic_sleep_white_24dp.png | Bin 509 -> 280 bytes .../res/drawable-xxhdpi/ic_sort_grey600_24dp.png | Bin 244 -> 115 bytes .../main/res/drawable-xxhdpi/ic_sort_white_24dp.png | Bin 241 -> 103 bytes .../drawable-xxhdpi/ic_star_border_grey600_24dp.png | Bin 1227 -> 1009 bytes .../drawable-xxhdpi/ic_star_border_white_24dp.png | Bin 1222 -> 934 bytes .../res/drawable-xxhdpi/ic_star_grey600_24dp.png | Bin 877 -> 703 bytes .../main/res/drawable-xxhdpi/ic_star_white_24dp.png | Bin 870 -> 657 bytes .../res/drawable-xxhdpi/ic_stat_authentication.png | Bin 1266 -> 848 bytes .../main/res/drawable-xxhdpi/ic_web_grey600_24dp.png | Bin 402 -> 245 bytes .../main/res/drawable-xxhdpi/ic_web_white_24dp.png | Bin 408 -> 234 bytes .../main/res/drawable-xxhdpi/stat_notify_sync.png | Bin 705 -> 545 bytes .../res/drawable-xxhdpi/stat_notify_sync_error.png | Bin 761 -> 577 bytes .../res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png | Bin 5878 -> 1332 bytes .../main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png | Bin 6299 -> 1362 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 466 -> 331 bytes .../ic_create_new_folder_white_24dp.png | Bin 463 -> 314 bytes .../res/drawable-xxxhdpi/ic_filter_grey600_24dp.png | Bin 235 -> 123 bytes .../res/drawable-xxxhdpi/ic_filter_white_24dp.png | Bin 234 -> 106 bytes .../drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png | Bin 854 -> 675 bytes .../drawable-xxxhdpi/ic_lock_closed_white_24dp.png | Bin 839 -> 646 bytes .../drawable-xxxhdpi/ic_lock_open_grey600_24dp.png | Bin 850 -> 674 bytes .../res/drawable-xxxhdpi/ic_lock_open_white_24dp.png | Bin 838 -> 643 bytes .../drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png | Bin 890 -> 583 bytes .../drawable-xxxhdpi/ic_sd_storage_white_36dp.png | Bin 890 -> 559 bytes .../res/drawable-xxxhdpi/ic_skip_grey600_36dp.png | Bin 737 -> 443 bytes .../main/res/drawable-xxxhdpi/ic_skip_white_36dp.png | Bin 749 -> 433 bytes .../res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png | Bin 955 -> 403 bytes .../drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png | Bin 1514 -> 637 bytes .../res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png | Bin 882 -> 580 bytes .../res/drawable-xxxhdpi/ic_sleep_white_24dp.png | Bin 647 -> 358 bytes .../drawable-xxxhdpi/ic_star_border_grey600_24dp.png | Bin 1675 -> 1352 bytes .../drawable-xxxhdpi/ic_star_border_white_24dp.png | Bin 1684 -> 1248 bytes .../res/drawable-xxxhdpi/ic_star_grey600_24dp.png | Bin 1179 -> 916 bytes .../main/res/drawable-xxxhdpi/ic_star_white_24dp.png | Bin 1183 -> 856 bytes 407 files changed, 0 insertions(+), 0 deletions(-) (limited to 'core/src') diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png index 37d73c734..af99f4b3b 100644 Binary files a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png index ad148cc6b..398dffa4b 100755 Binary files a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png index 492c8f880..69efaccd1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png index 481643ecd..023e5d21a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png index a32968a19..43783fbce 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png index 6f9df0934..115f7ebef 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png index bddb0b024..392c87bd2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png index e39de4dcf..41052af65 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png index 1f4fd985f..6a2ca5023 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png index 794b7b780..9698d4b7d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png index e4e833242..187a426a8 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png index 4f1a804b3..076773bca 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png index 6dbf83c58..ecaf0d5be 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png index d3f636f13..5ce64cc5f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png index bfe98fd07..75c703ae4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png index a8b0ada87..e6ae7f36b 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png index b72a9f3c6..501e60fa0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png index a9eac0ca7..4d8ce49e3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png index 6e42e1359..72eea4a8d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png index f42a0e2d2..9b4047a41 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png index f2d9906c6..a0b47594b 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png index a2a91938d..a4ce8fa7e 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png index 0f0ddf717..96ed70a40 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png index 724eb1f7a..f3c628e77 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png index 4d1c1d4ae..df9e662c1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png index deeff701f..59ae40266 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png index 03a54ee75..2d61b31f1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png index 60e3decf6..e5ae251d3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png index 9866ee629..f661ca723 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png index 8b9bfd34b..d36891a8d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png index b4f526e62..ab8b48ec3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png index 5d9d35f70..75796d7a9 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png index d1ad6629d..c09c73441 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png index 9ff662fca..43183d393 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png index c2222fb8e..62caf8392 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png index 46aeab458..8300268dc 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png index 83c564377..0d2f6ccb4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png index e3517a57d..ea6f9078e 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png index 294523814..2452cfa92 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png index 11114b568..96a06141a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png index f87403fa5..f02be50e2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png index b2b1332e1..a0756f264 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png index 62dd8ef48..e56fbf224 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png index 5bb43b464..dccf44930 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png index 713a9ba9a..754299c4a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png index f4b88742d..61ca3fee4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_launcher.png b/core/src/main/res/drawable-hdpi/ic_launcher.png index 994b763cc..8bd22b54a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_launcher.png and b/core/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png index 2aee6f902..11c973d3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png index 436113d27..4f1e57ec1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png index b6dba1002..3e52fd88d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png index 5c60ab08a..2260411cb 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png index a99e9f2b6..a42417431 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png index 61c623ce2..7bde52e12 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png index 7a08c4138..2aa5de2ad 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png index 0d08f329c..8f109572b 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png index 711e0cf94..7281f37e1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png index 5e884dfe8..dde9bb25c 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png index b4bdbb558..1701f34b0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png index da17d12ba..1d024393a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png index 264416933..b540e4a63 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png index 8af4c6cd6..a12b921e4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png index 164385d04..f77ad6b57 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png index 0cd5cb61a..2b8e3513f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png index 51cc4dbd1..ec8ac3041 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png index cd16fdd50..db069b266 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png index c4df13afa..4f1af39ab 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png index fdf524010..abc338d51 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png index 0890b2e5c..26a39bec9 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png index d9bfcfbfb..751e0e360 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png index ba65a135b..022f081e0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png index a2fc5b2e7..cc6d5da86 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png index 20d2b66e0..a7c216d3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png index 9c0172ad0..f8f215236 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png index 9b5a9fb47..eb2611f95 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png index f9a8915fd..14c7da0c2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png index 987e9b86c..9457cac52 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png index 93b3c219c..80c24d993 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png index edbc95b05..6e1dffc93 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png index cbfb262d8..760ec9987 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png index 809066499..f25063071 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png index 4496a320d..0db6381ea 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png index 79684ab65..c614c2b3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png index f0df6032c..5d8072149 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png index 0a52de9fe..715dea65f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png index 26014a542..9cdac3582 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png index 006410bc3..6b5bc858a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png index 27831192f..d59bc4792 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png index 93f70a024..e4fe7f43a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png index e8619b780..394c5a60c 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png index 36d502492..fb15f7ee1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png index c6b5efd33..f40820ef7 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png index 1942f3f12..57c236892 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png index 952404cbc..410ef41e9 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_widget_preview.png b/core/src/main/res/drawable-hdpi/ic_widget_preview.png index 8b583b285..85a537154 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_widget_preview.png and b/core/src/main/res/drawable-hdpi/ic_widget_preview.png differ diff --git a/core/src/main/res/drawable-hdpi/navigation_up.png b/core/src/main/res/drawable-hdpi/navigation_up.png index a2cf2ba52..370092e7e 100755 Binary files a/core/src/main/res/drawable-hdpi/navigation_up.png and b/core/src/main/res/drawable-hdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-hdpi/navigation_up_dark.png b/core/src/main/res/drawable-hdpi/navigation_up_dark.png index f2374a323..2b520c553 100755 Binary files a/core/src/main/res/drawable-hdpi/navigation_up_dark.png and b/core/src/main/res/drawable-hdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync.png b/core/src/main/res/drawable-hdpi/stat_notify_sync.png index ca6c68e4e..f70373d50 100644 Binary files a/core/src/main/res/drawable-hdpi/stat_notify_sync.png and b/core/src/main/res/drawable-hdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png index 84f19cd4e..222e9e8b1 100644 Binary files a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png index e44f42510..ddf545c0b 100644 Binary files a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-ldpi/ic_launcher.png b/core/src/main/res/drawable-ldpi/ic_launcher.png index 546090dd2..494468020 100644 Binary files a/core/src/main/res/drawable-ldpi/ic_launcher.png and b/core/src/main/res/drawable-ldpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png index 63d72970d..501dfa848 100644 Binary files a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png index 8808dedc7..41fd20655 100644 Binary files a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png index de69b17c0..550b56b33 100755 Binary files a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png index 07858bc09..27e311f39 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png index 977dd3427..3856041d7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png index 69b81c10d..0bf060d89 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png index 08c523d48..1e71c271f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png index 27738aacb..d305f0c69 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png index 5355abfd6..99ac9f3c9 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png index a7a30cc24..e91e2cbf6 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png index df332ef3c..c433d9ba0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png index a6bdce736..d5bdfa433 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png index cd90223d1..aefe5b6c1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png index 8a014bda1..a3a588c64 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png index 0811a3493..dc94cdbf4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png index eeed34653..45c0c29bf 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png index 3b9eaa827..02167a9f0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png index e757fdb07..3bf363a2b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png index e4ea52ef2..6b44a07da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png index 9f860915d..73f72da71 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png index e91f9048b..e094dee36 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png index 0d8277204..7cd66845b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png index 15d016e89..3d1fd0fe3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png index 00b9f645c..4d8cd8e99 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png index 6c2476660..682bcf79f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png index c2864a726..c67fc25f1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png index 4d1c1d4ae..df9e662c1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png index 215099f9e..fceffcb7b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png index 03a54ee75..2d61b31f1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png index 75adfc97e..de04575da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png index 9866ee629..f661ca723 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png index a050e1bb8..bfb476b4a 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png index b4f526e62..ab8b48ec3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png index 3932b6eef..8037c315e 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png index 9c2a1eb6e..026cac8f2 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png index b3ef8ce73..74d554774 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png index e089466de..b09c53c86 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png index e1e55d72b..b78e7d4d2 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png index 7d72e7562..59a2ec755 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png index df26536f9..ea44e3f07 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png index 0771a106d..78e98fe8d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png index 0a62d358f..397972f67 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png index b93da1006..bcc729de0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png index 52812c42f..0e6ce58e3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png index 20a9fe5d7..c496b4648 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png index 2537c5f42..b5c14a369 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png index 34f980085..6dbeeb0b7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_launcher.png b/core/src/main/res/drawable-mdpi/ic_launcher.png index 403dfabc4..219e8c5ab 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_launcher.png and b/core/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png index c5c2fc195..ac5b3bed4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png index 5e51ed478..15d8fc2bb 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png index f1627ce34..f9415627e 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png index 8f18d11e6..1203a4406 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png index ada8d3be4..192e27ccd 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png index 72d01c406..232b4bfb4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png index 494781a20..4b3ffdbdc 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png index 36e3262a4..c5bb20f49 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png index 06abcb50b..126ee03ef 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png index 711e0cf94..7281f37e1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png index 026f38854..2272d478c 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png index b4bdbb558..1701f34b0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png index 4ff5decb0..9c8f2c555 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png index 264416933..b540e4a63 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png index 8d1e433a5..172c211ab 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png index 164385d04..f77ad6b57 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png index c136c59fc..0e927f106 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png index 235c84f1e..79b5ec871 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png index 9e840f03e..daa8e568e 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png index 0bcba825f..a6b4ff0da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png index f0c5ed4c3..26977a920 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png index 6595d2e1e..4aeb2e668 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png index 29954062c..c386dbb38 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png index dff1e3a8a..faefc59c8 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png index 8995d0f43..dafbeca33 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png index c31fa8309..ccf89acea 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png index ee0248838..42eb539de 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png index 4d0197223..9d2ef6655 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png index be0fcc765..229eeca47 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png index 893cf2c64..9032328d4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png index ea511bf2a..df84861b9 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png index 7f631ad86..463b87d2f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png index 795e318e3..942e7f380 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png index 4304a6bca..9f37b124d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png index f527d0094..dc393caf7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png index e28dd4592..3d84a4442 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png index dd9d11ba0..8b5275b11 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png index 104fb3c9d..edfd7d71d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png index af84b71f2..246b43279 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png index 0ccebc7c8..c79334c61 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png index 8b1206b51..152239888 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png index cadfb9643..7fab11a83 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png index cdbce22a7..c620bc4dd 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png index 3602c4c48..f59e16fa9 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/navigation_up.png b/core/src/main/res/drawable-mdpi/navigation_up.png index 1ee248a79..520e11da6 100755 Binary files a/core/src/main/res/drawable-mdpi/navigation_up.png and b/core/src/main/res/drawable-mdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-mdpi/navigation_up_dark.png b/core/src/main/res/drawable-mdpi/navigation_up_dark.png index 8ef44cbac..e53627915 100755 Binary files a/core/src/main/res/drawable-mdpi/navigation_up_dark.png and b/core/src/main/res/drawable-mdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync.png b/core/src/main/res/drawable-mdpi/stat_notify_sync.png index 516b65bd9..02066f847 100644 Binary files a/core/src/main/res/drawable-mdpi/stat_notify_sync.png and b/core/src/main/res/drawable-mdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png index c3ed306cf..d797f59c3 100644 Binary files a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png index 59de64c87..30431ed6a 100644 Binary files a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png index f58fb21df..e83cbc333 100755 Binary files a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png index 0d8af34b9..19ed567e9 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png index 67042105d..67bb598e5 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png index ed34e22a1..270dc9bf8 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png index 3288241e7..2e0b8ff6f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png index db7b695e9..990ae524a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png index 3dc7bf5cb..d94a40811 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png index ce0da2222..2ad1ac3f5 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png index e9e9c7a53..e8836a1b0 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png index f7c205dd2..e46ab71b4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png index ea2ff8671..bb15a903a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png index a615ee436..336682497 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png index 946cfea57..cdb4a3181 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png index 82f0ad458..bb16eabce 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png index aa54623c8..ae5448d24 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png index c6bb43e8b..5ad22d0f1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png index cdb230c2f..63f990408 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png index 36ed24eec..3f78a47a3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png index e5024472a..5567661ac 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png index 8f335e274..83cb91561 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png index ae9972926..4b030e169 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png index 921249fb2..8e697365f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png index f00aa8bd4..16b7c081e 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png index 6c26d6ea2..6f8b42221 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png index 169a3b386..521f7490b 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png index b7c86059b..2b34fb82d 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png index 8aec1abb0..2d9a7e3c9 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png index d1db46a23..9468020b7 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png index ccac2c273..ea5493251 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png index 379435f54..f4182f174 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png index 857a1aaa2..de9ec1d90 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png index 995aafb5c..84554ce5b 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png index 1495c4fa6..339113c20 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png index aa89d4977..0d42f1749 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png index 990dfb82b..219f47167 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png index fdbb8eb4e..4c6a96eba 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png index 7e14f7fbf..9416c70ec 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png index a0c760e6f..d014684e1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png index 1b8722a7f..91adb4437 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png index a098d8d0f..c0ffea719 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png index 7681ac8b8..3aa40c305 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png index e67d41cc1..3b0d3aa1a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png index 48e52d596..57e478e9f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png index 9dcb234fe..57f3ec5e3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png index bee33abb7..e18df93a1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_launcher.png b/core/src/main/res/drawable-xhdpi/ic_launcher.png index 857a1b12e..2dbfd8874 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_launcher.png and b/core/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png index c51f8a258..030263ce3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png index abefc200a..2b7253975 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png index ca35f6d0a..c6f6fa06c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png index 01fb55ca1..873687188 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png index 11d9a4b8b..d82d4bd8b 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png index 01ca4b56c..a5ed62d8a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png index 655658557..a2bb4d1b8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png index 00a4daa62..e78b002f2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png index 3ec598cfd..6708b4161 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png index 7efc88511..aeb13ebc4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png index 14b6d17d4..f49aed757 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png index 72dfa9fa6..7192ad487 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png index 689fda259..6874b8236 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png index ba62a8102..dabd252ee 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png index a55d19922..5b0110454 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png index 043acd808..fff3e1f56 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png index 7891efffa..b2f5463a8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png index 5f89fc257..3dffcc846 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png index 7047ed7ea..2039d9ce8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png index ef2023b52..6dd240bca 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png index 48cc94622..57162f5ca 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png index b440536f6..ced6247ca 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png index f9c0b2ec3..b0999b31d 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png index 043759acd..ee844ccdd 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png index 2251d2bbb..5a70fdb99 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png index c30f31017..49813c945 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png index ea2313395..bac1560a2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png index 12e5d100d..d0cf80051 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png index 88a0edd6c..e856dca31 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png index dd536bca2..82692971c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png index 2e291dd19..31aa09ca2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png index fa85f1899..e664f607c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png index ae0787a26..2d8cb9a75 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png index 026224c5e..6ba86245c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png index ef39d7279..b03fb39b4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png index 07e156172..4d03cc0dc 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png index f2ef499ef..91447dc4c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png index 68b0b7ad3..6d4af1bcb 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png index 5160319b5..2bd46b7e7 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png index 33f9727d3..4eaf8b891 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png index 7a09ebc33..30f1e6ae6 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png index 288799f93..93d3b5d0c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png index 50d73271d..3d8a046a8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png index 4adfb636c..200b60c96 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png index a9f5ebc33..38150f680 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png index edc590a0b..cce57ef59 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/navigation_up.png b/core/src/main/res/drawable-xhdpi/navigation_up.png index f8c3e6f75..0f954094e 100755 Binary files a/core/src/main/res/drawable-xhdpi/navigation_up.png and b/core/src/main/res/drawable-xhdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png index 6964e069b..539222b2f 100755 Binary files a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png and b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png index ab02927fb..d7348168d 100644 Binary files a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png and b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png index c1f483f71..78c5df4d9 100644 Binary files a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png index 70e4e86e7..396d18bca 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png index 72cedcad4..0fdced8fc 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png index f90617f45..3b55c5d55 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png index 48e28102a..76cc4db32 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png index b5918c0f1..eebf0110c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png index 81709e0ae..38a5fc264 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png index f6f7844de..3d2aba75b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png index faa409f80..5bb0c3cc4 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png index 5e52fa65e..7093f28d5 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png index 9c8615618..050e6cd6c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png index 565a755f3..56d380575 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png index 7b1d9ea34..ba9af5265 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png index 802fc6fa0..23fa54d28 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png index 91cbc73d1..d8391d37c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png index 4886ab1e9..1a3a6192b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png index 0e95e9b1d..e4a5d0261 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png index c836c5490..7feeca3a1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png index f801e7ab3..edb552b49 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png index 88a800f24..dc8682716 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png index 148891e6c..808186aa9 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png index 503678f1b..07bb07a38 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png index 16094f9bc..fe5c3d280 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png index 169a3b386..521f7490b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png index 7b83df521..644645c8b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png index 8aec1abb0..2d9a7e3c9 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png index b4cf934f7..76c94c3ba 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png index ccac2c273..ea5493251 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png index 940b5413d..831fda2ab 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png index 857a1aaa2..de9ec1d90 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png index 751e5d1ba..8e11ac89e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png index ddfe32b53..62decef68 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png index 4929a6a11..7838ab87c 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png index e61a48a4d..82b0d1986 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png index 95502de3f..0b479dba2 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png index 43ec90ea5..5846ad140 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png index d3923efee..1263ae82e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png index 111ed802c..19456de04 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png index 417b39b81..82de8bb65 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png index 632a73e42..f083e0f2c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png index 3e438ec4e..17d6d29b8 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png index c2300b53b..2e7d39a5a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png index 66a710d8c..ec4981f5c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png index 64445284b..874226124 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png index 185d18d1a..8a1b185ff 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_launcher.png b/core/src/main/res/drawable-xxhdpi/ic_launcher.png index 2bef52ec7..41b261b4f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_launcher.png and b/core/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png index ceaf36811..c92e250b8 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png index 6b7e78f83..4d2807e4e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png index 311a7fa13..386595f99 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png index 39a163843..7bc7c690d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png index c0552d564..a424f4c5d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png index 46852d54f..d37d40dcb 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png index 3eccc24f0..79507d800 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png index 4a7083c57..a4dbba8ae 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png index 7efc88511..aeb13ebc4 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png index c8ed1d00a..8753d9c50 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png index 72dfa9fa6..7192ad487 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png index 76833ff7d..fb63ddc5a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png index ba62a8102..dabd252ee 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png index 1d44f8f2f..9fcf99558 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png index 043acd808..fff3e1f56 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png index fe7ea25cc..9b31e2d19 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png index 9c1e27d74..e5eef5d8a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png index 72128fe69..13157817d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png index 259ddcd14..16cdc31c1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png index ece7aeb74..695eb950e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png index 4352dbc06..597f417d5 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png index 5e18ed274..2ef908e26 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png index 9424ae98e..2cac5b19c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png index 0bbeab150..0ada3a39f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png index 6a70402b4..fe7d1a24d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png index 5404820db..37ce4c61a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png index 19752dd44..0609c3154 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png index 6bb8f6e08..e5de22411 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png index 89136d7c3..97a334744 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png index 9963c6a05..406bc9ab5 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png index 00a55a0f8..75a4a9545 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png index ac38e6d42..a31299c81 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png index f4bd9e94d..8346240f1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png index 6c42d6051..07748be06 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png index b8e06f9b3..8e2e80e71 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png index e2249c357..33770dbb1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png index 6cdc649ea..fa8c4c593 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png index 56ea13fe2..b8ef1050e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png index 6348e1997..06f24ef24 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png index aab4831ff..70785a1e3 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png index ef0294931..29fff7d5f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png index de4b7b29d..d5d478096 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png index b274bb60f..965fabc57 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png index 9e70743e8..abb58b77b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png index fcc2d1aca..abf5662b3 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png index 9cd2a53b4..dabb1ea27 100644 Binary files a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png and b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png index bb76c2756..6810a8249 100644 Binary files a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png index c9b68abf0..1c915d9dd 100755 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png index 87b0756eb..190bb0f4c 100755 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png index baf7b6ef7..448ca4898 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png index aa103bfd0..56a47309c 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png index 5d14b5b25..3fe8eb4dd 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png index e8b865e4a..cb2207f11 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png index e41d5b9ee..03ccfd0d6 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png index 2376b7334..2586be5ab 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png index c281784dd..e46b956e0 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png index 25ea3ab99..b2dd88c07 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png index cf03bc3f1..25d26d523 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png index 2996619c9..505fb28dc 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png index 94836e0c8..b599c2207 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png index a84f34228..a0dd670c3 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png index 9c0116c60..e8348b7e4 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png index e8141d0df..c06456421 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png index ca41ad5e6..5cf1d4f3b 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png index 29782e155..3e9984bf0 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png index 1109e95c8..d79dfa577 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png index 086cb677c..c2d2ee285 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png index dda3262ed..2866aff29 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png index ba29292b0..a74fee378 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png differ -- cgit v1.2.3 From 6b449c18ee6bd56fed7df0bcc556e26794d4aa73 Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Sun, 13 Mar 2016 22:15:59 -0700 Subject: Address error-prone warnings --- .../core/asynctask/FlattrClickWorker.java | 22 ++++++++++++---------- .../core/service/download/DownloadRequest.java | 3 ++- .../danoeh/antennapod/core/storage/DBReader.java | 3 ++- .../de/danoeh/antennapod/core/util/IntList.java | 2 +- 4 files changed, 17 insertions(+), 13 deletions(-) (limited to 'core/src') 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 ac032fcc0..c0ec8d08a 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 @@ -17,6 +17,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.ClientConfig; @@ -46,8 +47,8 @@ public class FlattrClickWorker extends AsyncTask 0) { + if (countFailed.get() > 0) { postFlattrFailedNotification(); } break; @@ -190,7 +191,8 @@ public class FlattrClickWorker extends AsyncTask getFeedItems(final long... itemIds) { - Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + itemIds + "]"); + Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + Arrays.toString(itemIds) + "]"); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); List items = getFeedItems(adapter, itemIds); 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 673c81235..1cbe7fade 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 @@ -35,7 +35,7 @@ public final class IntList { int hashCode = 1; for (int i = 0; i < size; i++) { int value = values[i]; - hashCode = 31 * hashCode + (int)(value ^ (value >>> 32)); + hashCode = 31 * hashCode + value; } return hashCode; } -- cgit v1.2.3 From e87f053d9b13785dc314e74b0ea3a30d244dbec7 Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Mon, 14 Mar 2016 20:04:25 -0700 Subject: Avoid unneeded boxing Found via FindBugs. --- .../core/gpoddernet/model/GpodnetEpisodeAction.java | 8 ++++---- .../antennapod/core/preferences/UserPreferences.java | 20 ++++++++++---------- .../core/service/download/DownloadService.java | 2 +- .../core/service/download/HttpDownloader.java | 2 +- .../core/syndication/namespace/NSITunes.java | 10 +++++----- .../de/danoeh/antennapod/core/util/Converter.java | 10 +++++----- .../de/danoeh/antennapod/core/util/DateUtils.java | 6 +++--- .../antennapod/core/util/playback/Timeline.java | 2 +- 8 files changed, 30 insertions(+), 30 deletions(-) (limited to 'core/src') 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 2d174a6bc..01c888d6b 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 @@ -63,10 +63,10 @@ public class GpodnetEpisodeAction { Action action = Action.valueOf(fields[3]); GpodnetEpisodeAction result = new Builder(podcast, episode, action) .deviceId(deviceId) - .timestamp(new Date(Long.valueOf(fields[4]))) - .started(Integer.valueOf(fields[5])) - .position(Integer.valueOf(fields[6])) - .total(Integer.valueOf(fields[7])) + .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) { 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 6c0aff15e..ac042de6f 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 @@ -158,12 +158,12 @@ public class UserPreferences { public static int getFeedOrder() { String value = prefs.getString(PREF_DRAWER_FEED_ORDER, "0"); - return Integer.valueOf(value); + return Integer.parseInt(value); } public static int getFeedCounterSetting() { String value = prefs.getString(PREF_DRAWER_FEED_COUNTER, "0"); - return Integer.valueOf(value); + return Integer.parseInt(value); } /** @@ -243,7 +243,7 @@ public class UserPreferences { } public static int getSmartMarkAsPlayedSecs() { - return Integer.valueOf(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30")); + return Integer.parseInt(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30")); } public static boolean isAutoFlattr() { @@ -295,8 +295,8 @@ public class UserPreferences { String datetime = prefs.getString(PREF_UPDATE_INTERVAL, ""); if(datetime.length() >= 3 && datetime.contains(":")) { String[] parts = datetime.split(":"); - int hourOfDay = Integer.valueOf(parts[0]); - int minute = Integer.valueOf(parts[1]); + int hourOfDay = Integer.parseInt(parts[0]); + int minute = Integer.parseInt(parts[1]); return new int[] { hourOfDay, minute }; } else { return new int[0]; @@ -308,7 +308,7 @@ public class UserPreferences { } public static int getParallelDownloads() { - return Integer.valueOf(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4")); + return Integer.parseInt(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4")); } public static int getEpisodeCacheSizeUnlimited() { @@ -338,12 +338,12 @@ public class UserPreferences { public static int getImageCacheSize() { String cacheSizeString = prefs.getString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE); - int cacheSizeInt = Integer.valueOf(cacheSizeString); + int cacheSizeInt = Integer.parseInt(cacheSizeString); // if the cache size is too small the user won't get any images at all // that's bad, force it back to the default. if (cacheSizeInt < IMAGE_CACHE_SIZE_MINIMUM) { prefs.edit().putString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE).apply(); - cacheSizeInt = Integer.valueOf(IMAGE_CACHE_DEFAULT_VALUE); + cacheSizeInt = Integer.parseInt(IMAGE_CACHE_DEFAULT_VALUE); } int cacheSizeMB = cacheSizeInt * 1024 * 1024; return cacheSizeMB; @@ -494,7 +494,7 @@ public class UserPreferences { if (valueFromPrefs.equals(context.getString(R.string.pref_episode_cache_unlimited))) { return EPISODE_CACHE_SIZE_UNLIMITED; } else { - return Integer.valueOf(valueFromPrefs); + return Integer.parseInt(valueFromPrefs); } } @@ -548,7 +548,7 @@ public class UserPreferences { public static EpisodeCleanupAlgorithm getEpisodeCleanupAlgorithm() { - int cleanupValue = Integer.valueOf(prefs.getString(PREF_EPISODE_CLEANUP, "-1")); + int cleanupValue = Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1")); if (cleanupValue == EPISODE_CLEANUP_QUEUE) { return new APQueueCleanupAlgorithm(); } else if (cleanupValue == EPISODE_CLEANUP_NULL) { 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 090c48ca0..be6cd88cb 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 @@ -188,7 +188,7 @@ public class DownloadService extends Service { if (status.getReason() == DownloadError.ERROR_UNAUTHORIZED) { postAuthenticationNotification(downloader.getDownloadRequest()); } else if (status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR - && Integer.valueOf(status.getReasonDetailed()) == 416) { + && Integer.parseInt(status.getReasonDetailed()) == 416) { Log.d(TAG, "Requested invalid range, restarting download from the beginning"); FileUtils.deleteQuietly(new File(downloader.getDownloadRequest().getDestination())); 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 e3a195253..31775326f 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 @@ -180,7 +180,7 @@ public class HttpDownloader extends Downloader { && !TextUtils.isEmpty(contentRangeHeader)) { String start = contentRangeHeader.substring("bytes ".length(), contentRangeHeader.indexOf("-")); - request.setSoFar(Long.valueOf(start)); + request.setSoFar(Long.parseLong(start)); Log.d(TAG, "Starting download at position " + request.getSoFar()); out = new RandomAccessFile(destination, "rw"); diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index 99c4cd67a..769a796e3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -60,12 +60,12 @@ public class NSITunes extends Namespace { try { int duration = 0; if (parts.length == 2) { - duration += TimeUnit.MINUTES.toMillis(Long.valueOf(parts[0])) + - TimeUnit.SECONDS.toMillis(Long.valueOf(parts[1])); + duration += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) + + TimeUnit.SECONDS.toMillis(Long.parseLong(parts[1])); } else if (parts.length >= 3) { - duration += TimeUnit.HOURS.toMillis(Long.valueOf(parts[0])) + - TimeUnit.MINUTES.toMillis(Long.valueOf(parts[1])) + - TimeUnit.SECONDS.toMillis(Long.valueOf(parts[2])); + duration += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) + + TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) + + TimeUnit.SECONDS.toMillis(Long.parseLong(parts[2])); } else { return; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java index 1b929b214..2e3afefa9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java @@ -88,9 +88,9 @@ public final class Converter { if (parts.length != 3) { return 0; } - return Integer.valueOf(parts[0]) * 3600 * 1000 + - Integer.valueOf(parts[1]) * 60 * 1000 + - Integer.valueOf(parts[2]) * 1000; + return Integer.parseInt(parts[0]) * 3600 * 1000 + + Integer.parseInt(parts[1]) * 60 * 1000 + + Integer.parseInt(parts[2]) * 1000; } /** Converts short duration string (HH:MM) to milliseconds. */ @@ -99,8 +99,8 @@ public final class Converter { if (parts.length != 2) { return 0; } - return Integer.valueOf(parts[0]) * 3600 * 1000 + - Integer.valueOf(parts[1]) * 1000 * 60; + return Integer.parseInt(parts[0]) * 3600 * 1000 + + Integer.parseInt(parts[1]) * 1000 * 60; } /** Converts milliseconds to a localized string containing hours and minutes */ diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java index 6b0f423df..d3e51a681 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java @@ -117,13 +117,13 @@ public class DateUtils { int idx = 0; if (parts.length == 3) { // string has hours - result += Integer.valueOf(parts[idx]) * 3600000L; + result += Integer.parseInt(parts[idx]) * 3600000L; idx++; } if (parts.length >= 2) { - result += Integer.valueOf(parts[idx]) * 60000L; + result += Integer.parseInt(parts[idx]) * 60000L; idx++; - result += (Float.valueOf(parts[idx])) * 1000L; + result += (Float.parseFloat(parts[idx])) * 1000L; } return result; } 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 2eee1ac87..61c35a5f8 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 @@ -148,7 +148,7 @@ public class Timeline { try { if (m.find()) { - return Integer.valueOf(m.group(1)); + return Integer.parseInt(m.group(1)); } } catch (NumberFormatException e) { e.printStackTrace(); -- cgit v1.2.3 From 734b19e906bb12486726a9f055714411da859d24 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 19 Feb 2016 10:54:31 +0100 Subject: Refactor --- .../java/de/danoeh/antennapod/core/util/playback/Timeline.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'core/src') 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 2eee1ac87..dae8abb7a 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 @@ -49,9 +49,8 @@ public class Timeline { 0xFFFFFF & colorResource); res.recycle(); - pageMargin = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, 8, context.getResources() - .getDisplayMetrics() + pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, + context.getResources().getDisplayMetrics() ); } @@ -125,8 +124,7 @@ public class Timeline { element.html(buffer.toString()); } } - - Log.i(TAG, "Out: " + document.toString()); + return document.toString(); } -- cgit v1.2.3 From 73069817f852c1b8cc584d143a0359d24cd2846c Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 19 Feb 2016 10:54:56 +0100 Subject: Show message if there are no shownotes --- .../antennapod/core/util/playback/Timeline.java | 52 ++++++++++++++++------ core/src/main/res/values/strings.xml | 2 + 2 files changed, 41 insertions(+), 13 deletions(-) (limited to 'core/src') 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 dae8abb7a..13a980774 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 @@ -2,7 +2,10 @@ package de.danoeh.antennapod.core.util.playback; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Color; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; @@ -14,6 +17,7 @@ import org.jsoup.select.Elements; import java.util.regex.Matcher; import java.util.regex.Pattern; +import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.ShownotesProvider; @@ -32,21 +36,28 @@ public class Timeline { private ShownotesProvider shownotesProvider; - - private final String colorString; + private final String noShownotesLabel; + private final String colorPrimaryString; + private final String colorSecondaryString; private final int pageMargin; public Timeline(Context context, ShownotesProvider shownotesProvider) { if (shownotesProvider == null) throw new IllegalArgumentException("shownotesProvider = null"); this.shownotesProvider = shownotesProvider; - TypedArray res = context - .getTheme() - .obtainStyledAttributes( - new int[]{android.R.attr.textColorPrimary}); - int colorResource = res.getColor(0, 0); - colorString = String.format("#%06X", - 0xFFFFFF & colorResource); + noShownotesLabel = context.getString(R.string.no_shownotes_label); + + TypedArray res = context.getTheme().obtainStyledAttributes( + new int[]{ android.R.attr.textColorPrimary}); + @ColorInt int col = res.getColor(0, 0); + colorPrimaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," + + Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")"; + res.recycle(); + res = context.getTheme().obtainStyledAttributes( + new int[]{android.R.attr.textColorSecondary}); + col = res.getColor(0, 0); + colorSecondaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," + + Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")"; res.recycle(); pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, @@ -81,9 +92,24 @@ public class Timeline { e.printStackTrace(); return null; } - if (shownotes == null) { - Log.d(TAG, "shownotesProvider contained no shownotes. Returning empty string"); - return ""; + + if(TextUtils.isEmpty(shownotes)) { + Log.d(TAG, "shownotesProvider contained no shownotes. Returning 'no shownotes' message"); + shownotes ="" + + "" + + "" + + "" + + "" + + "

" + noShownotesLabel + "

" + + "" + + ""; + Log.d(TAG, "shownotes: " + shownotes); + return shownotes; } // replace ASCII line breaks with HTML ones if shownotes don't contain HTML line breaks already @@ -94,7 +120,7 @@ public class Timeline { Document document = Jsoup.parse(shownotes); // apply style - String styleStr = String.format(WEBVIEW_STYLE, colorString, "100%", pageMargin, + String styleStr = String.format(WEBVIEW_STYLE, colorPrimaryString, "100%", pageMargin, pageMargin, pageMargin, pageMargin); document.head().appendElement("style").attr("type", "text/css").text(styleStr); diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 912a60f55..0d4518a15 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -278,6 +278,8 @@ There are no items in this list. You haven\'t subscribed to any feeds yet. This episode has no chapters. + This episode has no shownotes. + Other -- cgit v1.2.3 From 19e1e4afdba724c7b64116111c9c9538480be4f9 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Sat, 27 Feb 2016 23:34:45 +0100 Subject: Add proxy settings --- .../core/preferences/UserPreferences.java | 43 ++++++++++++++++++++++ .../service/download/AntennapodHttpClient.java | 32 ++++++++++++++-- .../core/service/download/ProxyConfig.java | 32 ++++++++++++++++ core/src/main/res/values/strings.xml | 15 ++++++++ 4 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java (limited to 'core/src') 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 ac042de6f..3631f881b 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 @@ -17,6 +17,7 @@ import org.json.JSONException; import java.io.File; import java.io.IOException; +import java.net.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -25,6 +26,7 @@ import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver; +import de.danoeh.antennapod.core.service.download.ProxyConfig; import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; @@ -78,6 +80,11 @@ public class UserPreferences { public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery"; public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter"; public static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks"; + public static final String PREF_PROXY_TYPE = "prefProxyType"; + public static final String PREF_PROXY_HOST = "prefProxyHost"; + public static final String PREF_PROXY_PORT = "prefProxyPort"; + public static final String PREF_PROXY_USER = "prefProxyUser"; + public static final String PREF_PROXY_PASSWORD = "prefProxyPassword"; // Services public static final String PREF_AUTO_FLATTR = "pref_auto_flattr"; @@ -371,6 +378,42 @@ public class UserPreferences { return TextUtils.split(selectedNetWorks, ","); } + public static void setProxyConfig(ProxyConfig config) { + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(PREF_PROXY_TYPE, config.type.name()); + if(TextUtils.isEmpty(config.host)) { + editor.remove(PREF_PROXY_HOST); + } else { + editor.putString(PREF_PROXY_HOST, config.host); + } + if(config.port <= 0 || config.port > 65535) { + editor.remove(PREF_PROXY_PORT); + } else { + editor.putInt(PREF_PROXY_PORT, config.port); + } + if(TextUtils.isEmpty(config.username)) { + editor.remove(PREF_PROXY_USER); + } else { + editor.putString(PREF_PROXY_USER, config.username); + } + if(TextUtils.isEmpty(config.password)) { + editor.remove(PREF_PROXY_PASSWORD); + } else { + editor.putString(PREF_PROXY_PASSWORD, config.password); + } + editor.apply(); + } + + public static ProxyConfig getProxyConfig() { + Proxy.Type type = Proxy.Type.valueOf(prefs.getString(PREF_PROXY_TYPE, Proxy.Type.DIRECT.name())); + String host = prefs.getString(PREF_PROXY_HOST, null); + 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; + } + public static boolean shouldResumeAfterCall() { return prefs.getBoolean(PREF_RESUME_AFTER_CALL, true); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java index b23819ef7..5dd1e2dfa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java @@ -2,8 +2,10 @@ package de.danoeh.antennapod.core.service.download; import android.os.Build; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.util.Log; +import com.squareup.okhttp.Credentials; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; @@ -14,7 +16,10 @@ import java.net.CookieManager; import java.net.CookiePolicy; import java.net.HttpURLConnection; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.net.Socket; +import java.net.SocketAddress; import java.net.URL; import java.security.GeneralSecurityException; import java.util.concurrent.TimeUnit; @@ -23,6 +28,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBWriter; /** @@ -44,12 +50,15 @@ public class AntennapodHttpClient { */ public static synchronized OkHttpClient getHttpClient() { if (httpClient == null) { - httpClient = newHttpClient(); } return httpClient; } + public static synchronized void reinit() { + httpClient = newHttpClient(); + } + /** * Creates a new HTTP client. Most users should just use * getHttpClient() to get the standard AntennaPod client, @@ -69,13 +78,13 @@ public class AntennapodHttpClient { client.networkInterceptors().add(chain -> { Request request = chain.request(); Response response = chain.proceed(request); - if(response.code() == HttpURLConnection.HTTP_MOVED_PERM || + if (response.code() == HttpURLConnection.HTTP_MOVED_PERM || response.code() == StatusLine.HTTP_PERM_REDIRECT) { String location = response.header("Location"); - if(location.startsWith("/")) { // URL is not absolute, but relative + if (location.startsWith("/")) { // URL is not absolute, but relative URL url = request.url(); location = url.getProtocol() + "://" + url.getHost() + location; - } else if(!location.toLowerCase().startsWith("http://") && + } else if (!location.toLowerCase().startsWith("http://") && !location.toLowerCase().startsWith("https://")) { // Reference is relative to current path URL url = request.url(); @@ -106,6 +115,21 @@ public class AntennapodHttpClient { client.setFollowRedirects(true); client.setFollowSslRedirects(true); + ProxyConfig config = UserPreferences.getProxyConfig(); + if (config.type != Proxy.Type.DIRECT) { + int port = config.port > 0 ? config.port : ProxyConfig.DEFAULT_PORT; + SocketAddress address = InetSocketAddress.createUnresolved(config.host, port); + Proxy proxy = new Proxy(config.type, address); + client.setProxy(proxy); + if (!TextUtils.isEmpty(config.username)) { + String credentials = Credentials.basic(config.username, config.password); + client.interceptors().add(chain -> { + Request request = chain.request().newBuilder() + .header("Proxy-Authorization", credentials).build(); + return chain.proceed(request); + }); + } + } if(16 <= Build.VERSION.SDK_INT && Build.VERSION.SDK_INT < 21) { client.setSslSocketFactory(new CustomSslSocketFactory()); } 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 new file mode 100644 index 000000000..e886932f2 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java @@ -0,0 +1,32 @@ +package de.danoeh.antennapod.core.service.download; + +import android.support.annotation.Nullable; + +import java.net.Proxy; + +public class ProxyConfig { + + public final Proxy.Type type; + @Nullable public final String host; + @Nullable public final int port; + @Nullable public final String username; + @Nullable public final String password; + + public final static int DEFAULT_PORT = 8080; + + public static ProxyConfig direct() { + return new ProxyConfig(Proxy.Type.DIRECT, null, 0, null, null); + } + + public static ProxyConfig http(String host, int port, String username, String password) { + return new ProxyConfig(Proxy.Type.HTTP, host, port, username, password); + } + + public ProxyConfig(Proxy.Type type, String host, int port, String username, String password) { + this.type = type; + this.host = host; + this.port = port; + this.username = username; + this.password = password; + } +} diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 0d4518a15..f9af78d63 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -387,6 +387,8 @@ Sonic media player Use built-in sonic media player as a replacement for Android\'s native mediaplayer and Prestissimo Current value: %1$s + Proxy + Set a network proxy Enable automatic flattring @@ -593,4 +595,17 @@ Downmix: Stereo to mono Sonic only + + Type + Host + Port + (Optional) + Test + Checking… + Test successful + Test failed + Host must not be empty + Host not valid UP or domain + Port not valid + -- cgit v1.2.3 From 4954db7738091774414e54e46cbea4f6833b227f Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 17 Mar 2016 18:25:19 +0100 Subject: Pre-select playback speeds 1.00, 1.25, 1.50, 1.75 and 2.00 only --- .../de/danoeh/antennapod/core/preferences/UserPreferences.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'core/src') 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 aa20b69b6..f9613cc3d 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 @@ -546,15 +546,7 @@ public class UserPreferences { String[] selectedSpeeds = null; // If this preference hasn't been set yet, return the default options if (valueFromPrefs == null) { - String[] allSpeeds = context.getResources().getStringArray(R.array.playback_speed_values); - List speedList = new ArrayList<>(); - for (String speedStr : allSpeeds) { - float speed = Float.parseFloat(speedStr); - if (speed < 2.0001 && speed * 10 % 1 == 0) { - speedList.add(speedStr); - } - } - selectedSpeeds = speedList.toArray(new String[speedList.size()]); + selectedSpeeds = new String[] { "1.00", "1.25", "1.50", "1.75", "2.00" }; } else { try { JSONArray jsonArray = new JSONArray(valueFromPrefs); -- cgit v1.2.3 From 4ba81f6c1453ecc93c3cd81462be53e0e37e6e07 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 3 Mar 2016 11:24:24 +0100 Subject: Only have one cursor open at the same time --- .../danoeh/antennapod/core/storage/DBReader.java | 37 ++++++++++++---------- 1 file changed, 21 insertions(+), 16 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index 68187306d..61a07ae2d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -590,17 +590,18 @@ public final class DBReader { FeedItem item = null; Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId)); - if (itemCursor.moveToFirst()) { - List list = extractItemlistFromCursor(adapter, itemCursor); - if (list.size() > 0) { - item = list.get(0); - loadAdditionalFeedItemListData(list); - if (item.hasChapters()) { - loadChaptersOfFeedItem(adapter, item); - } - } + if (!itemCursor.moveToFirst()) { + return null; } + List list = extractItemlistFromCursor(adapter, itemCursor); itemCursor.close(); + if (list.size() > 0) { + item = list.get(0); + loadAdditionalFeedItemListData(list); + if (item.hasChapters()) { + loadChaptersOfFeedItem(adapter, item); + } + } return item; } @@ -898,19 +899,23 @@ public final class DBReader { adapter.open(); Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId); - FeedMedia media = null; - if (mediaCursor.moveToFirst()) { - int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM); - final long itemId = mediaCursor.getLong(indexFeedItem); - media = FeedMedia.fromCursor(mediaCursor); + if (!mediaCursor.moveToFirst()) { + return null; + } + + int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM); + long itemId = mediaCursor.getLong(indexFeedItem); + FeedMedia media = FeedMedia.fromCursor(mediaCursor); + mediaCursor.close(); + + if(media != null) { FeedItem item = getFeedItem(itemId); - if (media != null && item != null) { + if (item != null) { media.setItem(item); item.setMedia(media); } } - mediaCursor.close(); adapter.close(); return media; -- cgit v1.2.3 From a4733e2643fdb70aaad3802644ec89d590dfcb78 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 17 Mar 2016 21:23:08 +0100 Subject: Show gpodder information --- core/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 777db5046..ea7e11a80 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -364,6 +364,7 @@ Sync now Sync subscriptions and episode states with gpodder.net Sync started + %1$s with device %2$s]]> Playback Speeds Customize the speeds available for variable speed audio playback Fast forward time -- cgit v1.2.3 From 5e7b328d8305872935157528384fe2f51818e1f9 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 8 Mar 2016 09:46:58 +0100 Subject: Make feed parsing as save as possible --- .../core/syndication/namespace/NSContent.java | 6 +- .../core/syndication/namespace/NSDublinCore.java | 25 ++++--- .../core/syndication/namespace/NSITunes.java | 64 ++++++++++++------ .../core/syndication/namespace/NSMedia.java | 39 +++++------ .../core/syndication/namespace/NSRSS20.java | 79 +++++++++++----------- .../syndication/namespace/NSSimpleChapters.java | 30 ++++---- 6 files changed, 137 insertions(+), 106 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java index 71bf69ffa..306b79c15 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java @@ -1,8 +1,9 @@ package de.danoeh.antennapod.core.syndication.namespace; -import de.danoeh.antennapod.core.syndication.handler.HandlerState; import org.xml.sax.Attributes; +import de.danoeh.antennapod.core.syndication.handler.HandlerState; + public class NSContent extends Namespace { public static final String NSTAG = "content"; public static final String NSURI = "http://purl.org/rss/1.0/modules/content/"; @@ -17,7 +18,8 @@ public class NSContent extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ENCODED)) { + if (ENCODED.equals(localName) && state.getCurrentItem() != null && + state.getContentBuf() != null) { state.getCurrentItem().setContentEncoded(state.getContentBuf().toString()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java index 23f76186b..377429053 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java @@ -2,6 +2,9 @@ package de.danoeh.antennapod.core.syndication.namespace; import org.xml.sax.Attributes; +import java.util.Stack; + +import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.syndication.handler.HandlerState; import de.danoeh.antennapod.core.util.DateUtils; @@ -21,16 +24,18 @@ public class NSDublinCore extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if(state.getTagstack().size() >= 2 - && state.getContentBuf() != null) { - String content = state.getContentBuf().toString(); - SyndElement topElement = state.getTagstack().peek(); - String top = topElement.getName(); - SyndElement secondElement = state.getSecondTag(); - String second = secondElement.getName(); - if (top.equals(DATE) && second.equals(ITEM)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); + if (state.getCurrentItem() != null && state.getTagstack().size() >= 2 && + state.getContentBuf() != null) { + FeedItem currentItem = state.getCurrentItem(); + Stack tagStack = state.getTagstack(); + if(tagStack.size() < 2) { + return; + } + String top = tagStack.peek().getName(); + String second = state.getSecondTag().getName(); + if (DATE.equals(top) && ITEM.equals(second)) { + String content = state.getContentBuf().toString(); + currentItem.setPubDate(DateUtils.parse(content)); } } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index 769a796e3..6f83d68df 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.core.syndication.namespace; import android.text.TextUtils; +import android.util.Log; import org.xml.sax.Attributes; @@ -10,6 +11,7 @@ import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.syndication.handler.HandlerState; public class NSITunes extends Namespace { + public static final String NSTAG = "itunes"; public static final String NSURI = "http://www.itunes.com/dtds/podcast-1.0.dtd"; @@ -26,69 +28,91 @@ public class NSITunes extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(IMAGE)) { + if (IMAGE.equals(localName)) { FeedImage image = new FeedImage(); image.setTitle(IMAGE_TITLE); image.setDownload_url(attributes.getValue(IMAGE_HREF)); if (state.getCurrentItem() != null) { // this is an items image - image.setTitle(state.getCurrentItem().getTitle()+IMAGE_TITLE); + image.setTitle(state.getCurrentItem().getTitle() + IMAGE_TITLE); image.setOwner(state.getCurrentItem()); state.getCurrentItem().setImage(image); - - } else { + } else { // this is the feed image // prefer to all other images - if(!TextUtils.isEmpty(image.getDownload_url())) { + if (!TextUtils.isEmpty(image.getDownload_url())) { image.setOwner(state.getFeed()); state.getFeed().setImage(image); } } - } - return new SyndElement(localName, this); } @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(AUTHOR)) { - state.getFeed().setAuthor(state.getContentBuf().toString()); - } else if (localName.equals(DURATION)) { - String[] parts = state.getContentBuf().toString().trim().split(":"); + if (AUTHOR.equals(localName)) { + if (state.getContentBuf() != null && state.getFeed() != null) { + String author = state.getContentBuf().toString(); + if(TextUtils.isEmpty(author)) { + return; + } + state.getFeed().setAuthor(author); + } + } else if (DURATION.equals(localName)) { + if (state.getContentBuf() == null) { + return; + } + String duration = state.getContentBuf().toString(); + if(TextUtils.isEmpty(duration)) { + return; + } + String[] parts = duration.trim().split(":"); try { - int duration = 0; + int durationMs = 0; if (parts.length == 2) { - duration += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) + + durationMs += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) + TimeUnit.SECONDS.toMillis(Long.parseLong(parts[1])); } else if (parts.length >= 3) { - duration += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) + + durationMs += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) + TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) + TimeUnit.SECONDS.toMillis(Long.parseLong(parts[2])); } else { return; } - state.getTempObjects().put(DURATION, duration); + state.getTempObjects().put(DURATION, durationMs); } catch (NumberFormatException e) { - e.printStackTrace(); + Log.e(NSTAG, Log.getStackTraceString(e)); + } + } else if (SUBTITLE.equals(localName)) { + if (state.getContentBuf() == null) { + return; } - } else if (localName.equals(SUBTITLE)) { String subtitle = state.getContentBuf().toString(); + if (TextUtils.isEmpty(subtitle)) { + return; + } if (state.getCurrentItem() != null) { if (TextUtils.isEmpty(state.getCurrentItem().getDescription())) { state.getCurrentItem().setDescription(subtitle); } } else { - if (TextUtils.isEmpty(state.getFeed().getDescription())) { + if (state.getFeed() != null && TextUtils.isEmpty(state.getFeed().getDescription())) { state.getFeed().setDescription(subtitle); } } - } else if (localName.equals(SUMMARY)) { + } else if (SUMMARY.equals(localName)) { + if (state.getContentBuf() == null) { + return; + } String summary = state.getContentBuf().toString(); + if (TextUtils.isEmpty(summary)) { + return; + } if (state.getCurrentItem() != null) { state.getCurrentItem().setDescription(summary); - } else { + } else if (state.getFeed() != null) { state.getFeed().setDescription(summary); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java index 7f03f1139..53460edf8 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java @@ -1,14 +1,15 @@ package de.danoeh.antennapod.core.syndication.namespace; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.syndication.handler.HandlerState; -import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils; + import org.xml.sax.Attributes; import java.util.concurrent.TimeUnit; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.syndication.handler.HandlerState; +import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils; + /** Processes tags from the http://search.yahoo.com/mrss/ namespace. */ public class NSMedia extends Namespace { private static final String TAG = "NSMedia"; @@ -25,10 +26,10 @@ public class NSMedia extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(CONTENT)) { + if (CONTENT.equals(localName)) { String url = attributes.getValue(DOWNLOAD_URL); String type = attributes.getValue(MIME_TYPE); - if (state.getCurrentItem().getMedia() == null + if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && url != null && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils .getValidMimeTypeFromUrl(url)) != null))) { @@ -37,24 +38,24 @@ public class NSMedia extends Namespace { try { size = Long.parseLong(attributes.getValue(SIZE)); } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Length attribute could not be parsed."); + Log.e(TAG, "Length attribute could not be parsed."); } - + int duration = 0; - try { - String durationStr = attributes.getValue(DURATION); - if (durationStr != null) { + String durationStr = attributes.getValue(DURATION); + if (durationStr != null) { + try { duration = (int) TimeUnit.MILLISECONDS.convert( - Long.parseLong(durationStr), TimeUnit.SECONDS); + Long.parseLong(durationStr), TimeUnit.SECONDS); + } catch (NumberFormatException e) { + Log.e(TAG, "Duration attribute could not be parsed"); } - } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Duration attribute could not be parsed"); } - - state.getCurrentItem().setMedia( - new FeedMedia(state.getCurrentItem(), url, size, type)); + FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); + if(duration > 0) { + media.setDuration(duration); + } + state.getCurrentItem().setMedia(media); } } return new SyndElement(localName, this); diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java index 7e19213be..d0888b5ea 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java @@ -1,10 +1,10 @@ package de.danoeh.antennapod.core.syndication.namespace; +import android.text.TextUtils; import android.util.Log; import org.xml.sax.Attributes; -import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; @@ -43,16 +43,16 @@ public class NSRSS20 extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(ITEM)) { + if (ITEM.equals(localName)) { state.setCurrentItem(new FeedItem()); state.getItems().add(state.getCurrentItem()); state.getCurrentItem().setFeed(state.getFeed()); - } else if (localName.equals(ENCLOSURE)) { + } else if (ENCLOSURE.equals(localName)) { String type = attributes.getValue(ENC_TYPE); String url = attributes.getValue(ENC_URL); - if (state.getCurrentItem().getMedia() == null - && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils + if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && + (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils .getValidMimeTypeFromUrl(url)) != null))) { long size = 0; @@ -63,19 +63,18 @@ public class NSRSS20 extends Namespace { size = 0; } } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Length attribute could not be parsed."); + Log.d(TAG, "Length attribute could not be parsed."); } state.getCurrentItem().setMedia( new FeedMedia(state.getCurrentItem(), url, size, type)); } - } else if (localName.equals(IMAGE)) { + } else if (IMAGE.equals(localName)) { if (state.getTagstack().size() >= 1) { String parent = state.getTagstack().peek().getName(); - if (parent.equals(CHANNEL)) { + if (CHANNEL.equals(parent)) { Feed feed = state.getFeed(); - if(feed.getImage() == null) { + if(feed != null && feed.getImage() == null) { feed.setImage(new FeedImage()); feed.getImage().setOwner(state.getFeed()); } @@ -87,26 +86,26 @@ public class NSRSS20 extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ITEM)) { + if (ITEM.equals(localName)) { if (state.getCurrentItem() != null) { + FeedItem currentItem = state.getCurrentItem(); // the title tag is optional in RSS 2.0. The description is used // as a // title if the item has no title-tag. - if (state.getCurrentItem().getTitle() == null) { - state.getCurrentItem().setTitle( - state.getCurrentItem().getDescription()); + if (currentItem.getTitle() == null) { + currentItem.setTitle(currentItem.getDescription()); } if (state.getTempObjects().containsKey(NSITunes.DURATION)) { - if (state.getCurrentItem().hasMedia()) { - state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION)); + if (currentItem.hasMedia()) { + Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION); + currentItem.getMedia().setDuration(duration); } state.getTempObjects().remove(NSITunes.DURATION); } } state.setCurrentItem(null); - } else if (state.getTagstack().size() >= 2 - && state.getContentBuf() != null) { + } else if (state.getTagstack().size() >= 2 && state.getContentBuf() != null) { String content = state.getContentBuf().toString(); SyndElement topElement = state.getTagstack().peek(); String top = topElement.getName(); @@ -117,45 +116,45 @@ public class NSRSS20 extends Namespace { third = state.getThirdTag().getName(); } - if (top.equals(GUID) && second.equals(ITEM)) { + if (GUID.equals(top) && ITEM.equals(second)) { // some feed creators include an empty or non-standard guid-element in their feed, which should be ignored - if (!content.isEmpty()) { + if (!TextUtils.isEmpty(content) && state.getCurrentItem() != null) { state.getCurrentItem().setItemIdentifier(content); } - } else if (top.equals(TITLE)) { + } else if (TITLE.equals(top)) { String title = content.trim(); - if (second.equals(ITEM)) { + if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setTitle(title); - } else if (second.equals(CHANNEL)) { + } else if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setTitle(title); - } else if (second.equals(IMAGE) && third != null - && third.equals(CHANNEL)) { - if(state.getFeed().getImage().getTitle() == null) { + } else if (IMAGE.equals(second) && third != null && CHANNEL.equals(third)) { + if(state.getFeed() != null && state.getFeed().getImage() != null && + state.getFeed().getImage().getTitle() == null) { state.getFeed().getImage().setTitle(title); } } - } else if (top.equals(LINK)) { - if (second.equals(CHANNEL)) { + } else if (LINK.equals(top)) { + if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setLink(content); - } else if (second.equals(ITEM)) { + } else if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setLink(content); } - } else if (top.equals(PUBDATE) && second.equals(ITEM)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } else if (top.equals(URL) && second.equals(IMAGE) && third != null - && third.equals(CHANNEL)) { - if(state.getFeed().getImage().getDownload_url() == null) { // prefer itunes:image + } else if (PUBDATE.equals(top) && ITEM.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (URL.equals(top) && IMAGE.equals(second) && third != null + && CHANNEL.equals(third)) { + // prefer itunes:image + if(state.getFeed() != null && state.getFeed().getImage() != null && + state.getFeed().getImage().getDownload_url() == null) { state.getFeed().getImage().setDownload_url(content); } - } else if (localName.equals(DESCR)) { - if (second.equals(CHANNEL)) { + } else if (DESCR.equals(localName)) { + if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setDescription(content); - } else if (second.equals(ITEM)) { + } else if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setDescription(content); } - - } else if (localName.equals(LANGUAGE)) { + } else if (LANGUAGE.equals(localName) && state.getFeed() != null) { state.getFeed().setLanguage(content.toLowerCase()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java index 64b82100e..703817a35 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java @@ -6,8 +6,7 @@ import org.xml.sax.Attributes; import java.util.ArrayList; -import de.danoeh.antennapod.core.BuildConfig; -import de.danoeh.antennapod.core.feed.Chapter; +import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.SimpleChapter; import de.danoeh.antennapod.core.syndication.handler.HandlerState; import de.danoeh.antennapod.core.util.DateUtils; @@ -27,21 +26,22 @@ public class NSSimpleChapters extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(CHAPTERS)) { - state.getCurrentItem().setChapters(new ArrayList()); - } else if (localName.equals(CHAPTER)) { - try { - state.getCurrentItem() - .getChapters() - .add(new SimpleChapter(DateUtils - .parseTimeString(attributes.getValue(START)), - attributes.getValue(TITLE), state.getCurrentItem(), - attributes.getValue(HREF))); - } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) Log.w(TAG, "Unable to read chapter", e); + FeedItem currentItem = state.getCurrentItem(); + if(currentItem != null) { + if (localName.equals(CHAPTERS)) { + currentItem.setChapters(new ArrayList<>()); + } else if (localName.equals(CHAPTER)) { + try { + long start = DateUtils.parseTimeString(attributes.getValue(START)); + String title = attributes.getValue(TITLE); + String link = attributes.getValue(HREF); + SimpleChapter chapter = new SimpleChapter(start, title, currentItem, link); + currentItem.getChapters().add(chapter); + } catch (NumberFormatException e) { + Log.e(TAG, "Unable to read chapter", e); + } } } - return new SyndElement(localName, this); } -- cgit v1.2.3 From d0126b54f12bb17b88b279f615ca33b3aa99a5f2 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 8 Mar 2016 09:47:04 +0100 Subject: Print log --- .../core/syndication/namespace/NSDublinCore.java | 13 +-- .../core/syndication/namespace/NSITunes.java | 17 +--- .../core/syndication/namespace/NSMedia.java | 27 +++--- .../core/syndication/namespace/NSRSS20.java | 17 ++-- .../core/syndication/namespace/atom/NSAtom.java | 103 ++++++++++----------- .../core/syndication/util/SyndTypeUtils.java | 3 +- 6 files changed, 83 insertions(+), 97 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java index 377429053..59d66a97e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java @@ -2,8 +2,6 @@ package de.danoeh.antennapod.core.syndication.namespace; import org.xml.sax.Attributes; -import java.util.Stack; - import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.syndication.handler.HandlerState; import de.danoeh.antennapod.core.util.DateUtils; @@ -24,14 +22,10 @@ public class NSDublinCore extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (state.getCurrentItem() != null && state.getTagstack().size() >= 2 && - state.getContentBuf() != null) { + if (state.getCurrentItem() != null && state.getContentBuf() != null && + state.getTagstack() != null && state.getTagstack().size() >= 2) { FeedItem currentItem = state.getCurrentItem(); - Stack tagStack = state.getTagstack(); - if(tagStack.size() < 2) { - return; - } - String top = tagStack.peek().getName(); + String top = state.getTagstack().peek().getName(); String second = state.getSecondTag().getName(); if (DATE.equals(top) && ITEM.equals(second)) { String content = state.getContentBuf().toString(); @@ -39,4 +33,5 @@ public class NSDublinCore extends Namespace { } } } + } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index 6f83d68df..dfd5cb74f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -52,18 +52,15 @@ public class NSITunes extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { + if(state.getContentBuf() == null) { + return; + } if (AUTHOR.equals(localName)) { - if (state.getContentBuf() != null && state.getFeed() != null) { + if (state.getFeed() != null) { String author = state.getContentBuf().toString(); - if(TextUtils.isEmpty(author)) { - return; - } state.getFeed().setAuthor(author); } } else if (DURATION.equals(localName)) { - if (state.getContentBuf() == null) { - return; - } String duration = state.getContentBuf().toString(); if(TextUtils.isEmpty(duration)) { return; @@ -86,9 +83,6 @@ public class NSITunes extends Namespace { Log.e(NSTAG, Log.getStackTraceString(e)); } } else if (SUBTITLE.equals(localName)) { - if (state.getContentBuf() == null) { - return; - } String subtitle = state.getContentBuf().toString(); if (TextUtils.isEmpty(subtitle)) { return; @@ -103,9 +97,6 @@ public class NSITunes extends Namespace { } } } else if (SUMMARY.equals(localName)) { - if (state.getContentBuf() == null) { - return; - } String summary = state.getContentBuf().toString(); if (TextUtils.isEmpty(summary)) { return; diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java index 53460edf8..39f553818 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.core.syndication.namespace; +import android.text.TextUtils; import android.util.Log; import org.xml.sax.Attributes; @@ -29,11 +30,15 @@ public class NSMedia extends Namespace { if (CONTENT.equals(localName)) { String url = attributes.getValue(DOWNLOAD_URL); String type = attributes.getValue(MIME_TYPE); - if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null - && url != null - && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils - .getValidMimeTypeFromUrl(url)) != null))) { - + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = SyndTypeUtils.getValidMimeTypeFromUrl(url); + validType = type != null; + } + if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && + url != null && validType) { long size = 0; try { size = Long.parseLong(attributes.getValue(SIZE)); @@ -41,19 +46,19 @@ public class NSMedia extends Namespace { Log.e(TAG, "Length attribute could not be parsed."); } - int duration = 0; + int durationMs = 0; String durationStr = attributes.getValue(DURATION); - if (durationStr != null) { + if (!TextUtils.isEmpty(durationStr)) { try { - duration = (int) TimeUnit.MILLISECONDS.convert( - Long.parseLong(durationStr), TimeUnit.SECONDS); + long duration = Long.parseLong(durationStr); + durationMs = (int) TimeUnit.MILLISECONDS.convert(duration, TimeUnit.SECONDS); } catch (NumberFormatException e) { Log.e(TAG, "Duration attribute could not be parsed"); } } FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); - if(duration > 0) { - media.setDuration(duration); + if(durationMs > 0) { + media.setDuration(durationMs); } state.getCurrentItem().setMedia(media); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java index d0888b5ea..1c7952a56 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java @@ -51,10 +51,15 @@ public class NSRSS20 extends Namespace { } else if (ENCLOSURE.equals(localName)) { String type = attributes.getValue(ENC_TYPE); String url = attributes.getValue(ENC_URL); + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = type = SyndTypeUtils.getValidMimeTypeFromUrl(url); + validType = type != null; + } if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && - (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils - .getValidMimeTypeFromUrl(url)) != null))) { - + validType) { long size = 0; try { size = Long.parseLong(attributes.getValue(ENC_LEN)); @@ -115,7 +120,6 @@ public class NSRSS20 extends Namespace { if (state.getTagstack().size() >= 3) { third = state.getThirdTag().getName(); } - if (GUID.equals(top) && ITEM.equals(second)) { // some feed creators include an empty or non-standard guid-element in their feed, which should be ignored if (!TextUtils.isEmpty(content) && state.getCurrentItem() != null) { @@ -127,7 +131,7 @@ public class NSRSS20 extends Namespace { state.getCurrentItem().setTitle(title); } else if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setTitle(title); - } else if (IMAGE.equals(second) && third != null && CHANNEL.equals(third)) { + } else if (IMAGE.equals(second) && CHANNEL.equals(third)) { if(state.getFeed() != null && state.getFeed().getImage() != null && state.getFeed().getImage().getTitle() == null) { state.getFeed().getImage().setTitle(title); @@ -141,8 +145,7 @@ public class NSRSS20 extends Namespace { } } else if (PUBDATE.equals(top) && ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setPubDate(DateUtils.parse(content)); - } else if (URL.equals(top) && IMAGE.equals(second) && third != null - && CHANNEL.equals(third)) { + } else if (URL.equals(top) && IMAGE.equals(second) && CHANNEL.equals(third)) { // prefer itunes:image if(state.getFeed() != null && state.getFeed().getImage() != null && state.getFeed().getImage().getDownload_url() == null) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java index b23a142af..7b5abf053 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.core.syndication.namespace.atom; +import android.text.TextUtils; import android.util.Log; import org.xml.sax.Attributes; @@ -65,21 +66,21 @@ public class NSAtom extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(ENTRY)) { + if (ENTRY.equals(localName)) { state.setCurrentItem(new FeedItem()); state.getItems().add(state.getCurrentItem()); state.getCurrentItem().setFeed(state.getFeed()); } else if (localName.matches(isText)) { String type = attributes.getValue(TEXT_TYPE); return new AtomText(localName, this, type); - } else if (localName.equals(LINK)) { + } else if (LINK.equals(localName)) { String href = attributes.getValue(LINK_HREF); String rel = attributes.getValue(LINK_REL); SyndElement parent = state.getTagstack().peek(); if (parent.getName().matches(isFeedItem)) { - if (rel == null || rel.equals(LINK_REL_ALTERNATE)) { + if (LINK_REL_ALTERNATE.equals(rel)) { state.getCurrentItem().setLink(href); - } else if (rel.equals(LINK_REL_ENCLOSURE)) { + } else if (LINK_REL_ENCLOSURE.equals(rel)) { String strSize = attributes.getValue(LINK_LENGTH); long size = 0; try { @@ -90,40 +91,45 @@ public class NSAtom extends Namespace { Log.d(TAG, "Length attribute could not be parsed."); } String type = attributes.getValue(LINK_TYPE); - if (SyndTypeUtils.enclosureTypeValid(type) - || (type = SyndTypeUtils.getValidMimeTypeFromUrl(href)) != null) { + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = SyndTypeUtils.getValidMimeTypeFromUrl(href); + validType = type != null; + } + if (validType) { FeedItem currItem = state.getCurrentItem(); - if(!currItem.hasMedia()) { + if(currItem != null && !currItem.hasMedia()) { currItem.setMedia(new FeedMedia(currItem, href, size, type)); } } - } else if (rel.equals(LINK_REL_PAYMENT)) { + } else if (LINK_REL_PAYMENT.equals(rel)) { state.getCurrentItem().setPaymentLink(href); } } else if (parent.getName().matches(isFeed)) { - if (rel == null || rel.equals(LINK_REL_ALTERNATE)) { + if (LINK_REL_ALTERNATE.equals(rel)) { String type = attributes.getValue(LINK_TYPE); /* * Use as link if a) no type-attribute is given and * feed-object has no link yet b) type of link is * LINK_TYPE_HTML or LINK_TYPE_XHTML */ - if ((type == null && state.getFeed().getLink() == null) - || (type != null && (type.equals(LINK_TYPE_HTML) - || type.equals(LINK_TYPE_XHTML)))) { + if (state.getFeed() != null && + ((type == null && state.getFeed().getLink() == null) || + (LINK_TYPE_HTML.equals(type) || LINK_TYPE_XHTML.equals(type)))) { state.getFeed().setLink(href); - } else if (type != null && (type.equals(LINK_TYPE_ATOM) - || type.equals(LINK_TYPE_RSS))) { + } else if (LINK_TYPE_ATOM.equals(type) || LINK_TYPE_RSS.equals(type)) { // treat as podlove alternate feed String title = attributes.getValue(LINK_TITLE); - if (title == null) { + if (TextUtils.isEmpty(title)) { title = href; } state.addAlternateFeedUrl(title, href); } - } else if (rel.equals(LINK_REL_PAYMENT)) { + } else if (LINK_REL_PAYMENT.equals(rel) && state.getFeed() != null) { state.getFeed().setPaymentLink(href); - } else if (rel.equals(LINK_REL_NEXT)) { + } else if (LINK_REL_NEXT.equals(rel) && state.getFeed() != null) { state.getFeed().setPaged(true); state.getFeed().setNextPageLink(href); } @@ -134,11 +140,13 @@ public class NSAtom extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ENTRY)) { + if (ENTRY.equals(localName)) { if (state.getCurrentItem() != null && state.getTempObjects().containsKey(NSITunes.DURATION)) { - if (state.getCurrentItem().hasMedia()) { - state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION)); + FeedItem currentItem = state.getCurrentItem(); + if (currentItem.hasMedia()) { + Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION); + currentItem.getMedia().setDuration(duration); } state.getTempObjects().remove(NSITunes.DURATION); } @@ -163,47 +171,32 @@ public class NSAtom extends Namespace { textElement.setContent(content); } - if (top.equals(ID)) { - if (second.equals(FEED)) { + if (ID.equals(top)) { + if (FEED.equals(second) && state.getFeed() != null) { state.getFeed().setFeedIdentifier(content); - } else if (second.equals(ENTRY)) { + } else if (ENTRY.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setItemIdentifier(content); } - } else if (top.equals(TITLE)) { - - if (second.equals(FEED)) { + } else if (TITLE.equals(top) && textElement != null) { + if (FEED.equals(second) && state.getFeed() != null) { state.getFeed().setTitle(textElement.getProcessedContent()); - } else if (second.equals(ENTRY)) { - state.getCurrentItem().setTitle( - textElement.getProcessedContent()); - } - } else if (top.equals(SUBTITLE)) { - if (second.equals(FEED)) { - state.getFeed().setDescription( - textElement.getProcessedContent()); - } - } else if (top.equals(CONTENT)) { - if (second.equals(ENTRY)) { - state.getCurrentItem().setDescription( - textElement.getProcessedContent()); - } - } else if (top.equals(UPDATED)) { - if (second.equals(ENTRY) - && state.getCurrentItem().getPubDate() == null) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } - } else if (top.equals(PUBLISHED)) { - if (second.equals(ENTRY)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } - } else if (top.equals(IMAGE)) { - if(state.getFeed().getImage() == null) { - state.getFeed().setImage(new FeedImage(state.getFeed(), content, null)); + } else if (ENTRY.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setTitle(textElement.getProcessedContent()); } + } else if (SUBTITLE.equals(top) && FEED.equals(second) && textElement != null && + state.getFeed() != null) { + state.getFeed().setDescription(textElement.getProcessedContent()); + } else if (CONTENT.equals(top) && ENTRY.equals(second) && textElement != null && + state.getCurrentItem() != null) { + state.getCurrentItem().setDescription(textElement.getProcessedContent()); + } else if (UPDATED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null && + state.getCurrentItem().getPubDate() == null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (PUBLISHED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (IMAGE.equals(top) && state.getFeed() != null && state.getFeed().getImage() == null) { + state.getFeed().setImage(new FeedImage(state.getFeed(), content, null)); } - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java index 8d1d8ffde..e84361fb2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java @@ -30,8 +30,7 @@ public class SyndTypeUtils { if (url != null) { String extension = FilenameUtils.getExtension(url); if (extension != null) { - String type = MimeTypeMap.getSingleton() - .getMimeTypeFromExtension(extension); + String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); if (type != null && enclosureTypeValid(type)) { return type; } -- cgit v1.2.3 From 466e6003b53296682a180b8360a3577424a51049 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 15 Mar 2016 14:10:15 +0100 Subject: Link to known issues/bugs in Settings --- core/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index a94c9ad2d..5b3ce4013 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -394,6 +394,8 @@ Current value: %1$s Proxy Set a network proxy + Known issues + No web browser found." Enable automatic flattring -- cgit v1.2.3 From 0c85447136ae588716d8efc495d7a582b08a6884 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 15:51:03 +0100 Subject: Prevent NullPointerException --- core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java | 2 +- core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'core/src') 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 d2d7cbc73..60b52ea9a 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 @@ -324,7 +324,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { if (super.compareWithOther(other)) { return true; } - if (!title.equals(other.title)) { + if (!TextUtils.equals(title, other.title)) { return true; } if (other.feedIdentifier != null) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java index 3dc58654b..ca9af058b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.feed; +import android.text.TextUtils; + import java.io.File; /** @@ -54,7 +56,7 @@ public abstract class FeedFile extends FeedComponent { if (super.compareWithOther(other)) { return true; } - if (!download_url.equals(other.download_url)) { + if (!TextUtils.equals(download_url, other.download_url)) { return true; } return false; -- cgit v1.2.3 From abaa7a28b265657e1aaa113d31f3e023a78501c7 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 15:51:17 +0100 Subject: Refactor --- core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java | 3 +-- core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'core/src') 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 60b52ea9a..dfcc71658 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 @@ -328,8 +328,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { return true; } if (other.feedIdentifier != null) { - if (feedIdentifier == null - || !feedIdentifier.equals(other.feedIdentifier)) { + if (feedIdentifier == null || !feedIdentifier.equals(other.feedIdentifier)) { return true; } } 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 faf23a37a..019001da7 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 @@ -95,8 +95,9 @@ public class FeedPreferences { * @return True if the two objects are different. */ public boolean compareWithOther(FeedPreferences other) { - if (other == null) + if (other == null) { return true; + } if (!TextUtils.equals(username, other.username)) { return true; } -- cgit v1.2.3 From c1b169cdb5276a72d8341e7b4a009020409f3d28 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 15:57:20 +0100 Subject: Parse seconds as float --- .../de/danoeh/antennapod/core/syndication/namespace/NSITunes.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index dfd5cb74f..e5f53d8ea 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -70,16 +70,17 @@ public class NSITunes extends Namespace { int durationMs = 0; if (parts.length == 2) { durationMs += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) + - TimeUnit.SECONDS.toMillis(Long.parseLong(parts[1])); + TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[1])); } else if (parts.length >= 3) { durationMs += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) + TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) + - TimeUnit.SECONDS.toMillis(Long.parseLong(parts[2])); + TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[2])); } else { return; } state.getTempObjects().put(DURATION, durationMs); } catch (NumberFormatException e) { + Log.e(NSTAG, "duration: " + duration); Log.e(NSTAG, Log.getStackTraceString(e)); } } else if (SUBTITLE.equals(localName)) { -- cgit v1.2.3 From d2ddfa397383f1526e2f335295db6a97f4268e50 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 16:08:21 +0100 Subject: Close cursor --- core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index e69e1887d..fc7d83978 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -901,6 +901,7 @@ public final class DBReader { Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId); if (!mediaCursor.moveToFirst()) { + mediaCursor.close(); return null; } -- cgit v1.2.3 From 7b3b7cc2ba2a44e859963b472a07c78052f7f0b9 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 16:10:52 +0100 Subject: Refactor --- .../danoeh/antennapod/core/syndication/namespace/NSITunes.java | 9 ++++----- .../de/danoeh/antennapod/core/syndication/namespace/NSMedia.java | 7 ++++--- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index e5f53d8ea..1c424c6b5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -61,11 +61,11 @@ public class NSITunes extends Namespace { state.getFeed().setAuthor(author); } } else if (DURATION.equals(localName)) { - String duration = state.getContentBuf().toString(); - if(TextUtils.isEmpty(duration)) { + String durationStr = state.getContentBuf().toString(); + if(TextUtils.isEmpty(durationStr)) { return; } - String[] parts = duration.trim().split(":"); + String[] parts = durationStr.trim().split(":"); try { int durationMs = 0; if (parts.length == 2) { @@ -80,8 +80,7 @@ public class NSITunes extends Namespace { } state.getTempObjects().put(DURATION, durationMs); } catch (NumberFormatException e) { - Log.e(NSTAG, "duration: " + duration); - Log.e(NSTAG, Log.getStackTraceString(e)); + Log.e(NSTAG, "Duration \"" + durationStr + "\" could not be parsed"); } } else if (SUBTITLE.equals(localName)) { String subtitle = state.getContentBuf().toString(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java index 39f553818..7a8b2bc03 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java @@ -40,10 +40,11 @@ public class NSMedia extends Namespace { if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && url != null && validType) { long size = 0; + String sizeStr = attributes.getValue(SIZE); try { - size = Long.parseLong(attributes.getValue(SIZE)); + size = Long.parseLong(sizeStr); } catch (NumberFormatException e) { - Log.e(TAG, "Length attribute could not be parsed."); + Log.e(TAG, "Size \"" + sizeStr + "\" could not be parsed."); } int durationMs = 0; @@ -53,7 +54,7 @@ public class NSMedia extends Namespace { long duration = Long.parseLong(durationStr); durationMs = (int) TimeUnit.MILLISECONDS.convert(duration, TimeUnit.SECONDS); } catch (NumberFormatException e) { - Log.e(TAG, "Duration attribute could not be parsed"); + Log.e(TAG, "Duration \"" + durationStr + "\" could not be parsed"); } } FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); -- cgit v1.2.3 From 3adb63fbc7d9e8a6456dbb5c1ccbf17e1ba16524 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Mon, 21 Mar 2016 19:14:01 +0100 Subject: When retrieving position of current episode, regard position 0 [unplayed] as valid --- .../core/service/playback/PlaybackServiceMediaPlayer.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'core/src') 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..3c41fc0a4 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 @@ -618,10 +618,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre || playerStatus == PlayerStatus.PREPARED || playerStatus == PlayerStatus.SEEKING) { retVal = mediaPlayer.getCurrentPosition(); - if(retVal <= 0 && media != null && media.getPosition() > 0) { - retVal = media.getPosition(); - } - } else if (media != null && media.getPosition() > 0) { + } + if (retVal <= 0 && media != null && media.getPosition() >= 0) { retVal = media.getPosition(); } -- cgit v1.2.3 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') 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') 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 748d2bc8634e6827e57f0b7bda9e3ef4bacabbcd Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Tue, 22 Mar 2016 02:12:59 -0400 Subject: fix FlattrServiceCreator --- .../danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java index e4818214e..e09b6642e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java @@ -1,11 +1,13 @@ package de.danoeh.antennapod.core.util.flattr; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; + import org.shredzone.flattr4j.FlattrFactory; import org.shredzone.flattr4j.FlattrService; import org.shredzone.flattr4j.oauth.AccessToken; +import de.danoeh.antennapod.core.BuildConfig; + /** Ensures that only one instance of the FlattrService class exists at a time */ public class FlattrServiceCreator { @@ -14,7 +16,10 @@ public class FlattrServiceCreator { private static volatile FlattrService flattrService; public static FlattrService getService(AccessToken token) { - return FlattrFactory.getInstance().createFlattrService(token); + if (flattrService == null) { + flattrService = FlattrFactory.getInstance().createFlattrService(token); + } + return flattrService; } public static void deleteFlattrService() { -- cgit v1.2.3 From a7d00f952ca8d551210ec903d9348416c30fe755 Mon Sep 17 00:00:00 2001 From: Domingos Lopes Date: Tue, 22 Mar 2016 11:36:24 -0400 Subject: make FlattrService creation and deletion synchronized --- .../de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java index e09b6642e..97958eea7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java @@ -15,14 +15,14 @@ public class FlattrServiceCreator { private static volatile FlattrService flattrService; - public static FlattrService getService(AccessToken token) { + public synchronized static FlattrService getService(AccessToken token) { if (flattrService == null) { flattrService = FlattrFactory.getInstance().createFlattrService(token); } return flattrService; } - public static void deleteFlattrService() { + public synchronized static void deleteFlattrService() { if (BuildConfig.DEBUG) Log.d(TAG, "Deleting service instance"); flattrService = null; } -- 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') 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 From a7368eadd9053ed846733da1e1ed10e18e0d242c Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 8 Mar 2016 15:11:28 +0100 Subject: Enable WAL and use non-exclusive transactions --- .../antennapod/core/storage/PodDBAdapter.java | 283 ++++++++++++++------- 1 file changed, 186 insertions(+), 97 deletions(-) (limited to 'core/src') 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 ffe5b2f24..2bde6da9d 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 @@ -10,6 +10,7 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.media.MediaMetadataRetriever; +import android.os.Build; import android.text.TextUtils; import android.util.Log; @@ -323,6 +324,9 @@ public class PodDBAdapter { Log.v(TAG, "Opening DB"); try { db = dbHelper.getWritableDatabase(); + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.enableWriteAheadLogging(); + } } catch (SQLException ex) { Log.e(TAG, Log.getStackTraceString(ex)); db = dbHelper.getReadableDatabase(); @@ -425,34 +429,46 @@ public class PodDBAdapter { */ public long setImage(FeedImage image) { boolean startedTransaction = false; - if(!db.inTransaction()) { - db.beginTransaction(); - startedTransaction = true; - } - ContentValues values = new ContentValues(); - values.put(KEY_TITLE, image.getTitle()); - values.put(KEY_DOWNLOAD_URL, image.getDownload_url()); - values.put(KEY_DOWNLOADED, image.isDownloaded()); - values.put(KEY_FILE_URL, image.getFile_url()); - if (image.getId() == 0) { - image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values)); - } else { - db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?", + try { + if (!db.inTransaction()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + startedTransaction = true; + } + + ContentValues values = new ContentValues(); + values.put(KEY_TITLE, image.getTitle()); + values.put(KEY_DOWNLOAD_URL, image.getDownload_url()); + values.put(KEY_DOWNLOADED, image.isDownloaded()); + values.put(KEY_FILE_URL, image.getFile_url()); + if (image.getId() == 0) { + image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values)); + } else { + db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?", new String[]{String.valueOf(image.getId())}); - } + } - final FeedComponent owner = image.getOwner(); - if (owner != null && owner.getId() != 0) { - values.clear(); - values.put(KEY_IMAGE, image.getId()); - if (owner instanceof Feed) { - db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())}); + final FeedComponent owner = image.getOwner(); + if (owner != null && owner.getId() != 0) { + values.clear(); + values.put(KEY_IMAGE, image.getId()); + if (owner instanceof Feed) { + db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())}); + } + } + if (startedTransaction) { + db.setTransactionSuccessful(); + } + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + if (startedTransaction) { + db.endTransaction(); } - } - if(startedTransaction) { - db.setTransactionSuccessful(); - db.endTransaction(); } return image.getId(); } @@ -522,20 +538,29 @@ public class PodDBAdapter { * transaction */ public void setCompleteFeed(Feed... feeds) { - db.beginTransaction(); - for (Feed feed : feeds) { - setFeed(feed); - if (feed.getItems() != null) { - for (FeedItem item : feed.getItems()) { - setFeedItem(item, false); - } + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); } - if (feed.getPreferences() != null) { - setFeedPreferences(feed.getPreferences()); + for (Feed feed : feeds) { + setFeed(feed); + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + setFeedItem(item, false); + } + } + if (feed.getPreferences() != null) { + setFeedPreferences(feed.getPreferences()); + } } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } /** @@ -598,19 +623,38 @@ public class PodDBAdapter { } public void setFeedItemlist(List items) { - db.beginTransaction(); - for (FeedItem item : items) { - setFeedItem(item, true); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + for (FeedItem item : items) { + setFeedItem(item, true); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public long setSingleFeedItem(FeedItem item) { - db.beginTransaction(); - long result = setFeedItem(item, true); - db.setTransactionSuccessful(); - db.endTransaction(); + long result = 0; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + result = setFeedItem(item, true); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } return result; } @@ -728,20 +772,29 @@ public class PodDBAdapter { public void setFeedItemRead(int played, long itemId, long mediaId, boolean resetMediaPosition) { - db.beginTransaction(); - ContentValues values = new ContentValues(); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + ContentValues values = new ContentValues(); - values.put(KEY_READ, played); - db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)}); + values.put(KEY_READ, played); + db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)}); - if (resetMediaPosition) { - values.clear(); - values.put(KEY_POSITION, 0); - db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)}); - } + if (resetMediaPosition) { + values.clear(); + values.put(KEY_POSITION, 0); + db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)}); + } - db.setTransactionSuccessful(); - db.endTransaction(); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } } /** @@ -750,15 +803,24 @@ public class PodDBAdapter { * @param itemIds items to change the value of */ public void setFeedItemRead(int read, long... itemIds) { - db.beginTransaction(); - ContentValues values = new ContentValues(); - for (long id : itemIds) { - values.clear(); - values.put(KEY_READ, read); - db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + ContentValues values = new ContentValues(); + for (long id : itemIds) { + values.clear(); + values.put(KEY_READ, read); + db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public void setChapters(FeedItem item) { @@ -822,17 +884,26 @@ public class PodDBAdapter { public void setFavorites(List favorites) { ContentValues values = new ContentValues(); - db.beginTransaction(); - db.delete(TABLE_NAME_FAVORITES, null, null); - for (int i = 0; i < favorites.size(); i++) { - FeedItem item = favorites.get(i); - values.put(KEY_ID, i); - values.put(KEY_FEEDITEM, item.getId()); - values.put(KEY_FEED, item.getFeed().getId()); - db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + db.delete(TABLE_NAME_FAVORITES, null, null); + for (int i = 0; i < favorites.size(); i++) { + FeedItem item = favorites.get(i); + values.put(KEY_ID, i); + values.put(KEY_FEEDITEM, item.getId()); + values.put(KEY_FEED, item.getFeed().getId()); + db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } /** @@ -880,17 +951,26 @@ public class PodDBAdapter { public void setQueue(List queue) { ContentValues values = new ContentValues(); - db.beginTransaction(); - db.delete(TABLE_NAME_QUEUE, null, null); - for (int i = 0; i < queue.size(); i++) { - FeedItem item = queue.get(i); - values.put(KEY_ID, i); - values.put(KEY_FEEDITEM, item.getId()); - values.put(KEY_FEED, item.getFeed().getId()); - db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + db.delete(TABLE_NAME_QUEUE, null, null); + for (int i = 0; i < queue.size(); i++) { + FeedItem item = queue.get(i); + values.put(KEY_ID, i); + values.put(KEY_FEEDITEM, item.getId()); + values.put(KEY_FEED, item.getFeed().getId()); + db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public void clearQueue() { @@ -937,23 +1017,32 @@ public class PodDBAdapter { * Remove a feed with all its FeedItems and Media entries. */ public void removeFeed(Feed feed) { - db.beginTransaction(); - if (feed.getImage() != null) { - removeFeedImage(feed.getImage()); - } - if (feed.getItems() != null) { - for (FeedItem item : feed.getItems()) { - removeFeedItem(item); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); } - } - // delete download log entries for feed - db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE +"=?", - new String[] { String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED) }); + if (feed.getImage() != null) { + removeFeedImage(feed.getImage()); + } + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + removeFeedItem(item); + } + } + // delete download log entries for feed + db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?", + new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)}); - db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?", + db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?", new String[]{String.valueOf(feed.getId())}); - db.setTransactionSuccessful(); - db.endTransaction(); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } } public void clearPlaybackHistory() { -- cgit v1.2.3 From 62e2095a5ab83ee2361ce0051d8a9bf2c170f0e5 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Tue, 22 Mar 2016 18:50:50 +0100 Subject: Close DB --- .../danoeh/antennapod/core/storage/PodDBAdapter.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'core/src') 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 2bde6da9d..c8df0f572 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 @@ -17,6 +17,7 @@ import android.util.Log; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.event.ProgressEvent; @@ -304,7 +305,7 @@ public class PodDBAdapter { private static SQLiteDatabase db; private static Context context; private static PodDBHelper dbHelper; - private static int counter = 0; + private static AtomicInteger counter = new AtomicInteger(0); public static void init(Context context) { PodDBAdapter.context = context.getApplicationContext(); @@ -319,12 +320,13 @@ public class PodDBAdapter { private PodDBAdapter() {} - public PodDBAdapter open() { + public synchronized PodDBAdapter open() { + int adapters = counter.incrementAndGet(); + Log.v(TAG, "Opening DB #" + adapters); if (db == null || !db.isOpen() || db.isReadOnly()) { - Log.v(TAG, "Opening DB"); try { db = dbHelper.getWritableDatabase(); - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { db.enableWriteAheadLogging(); } } catch (SQLException ex) { @@ -335,8 +337,13 @@ public class PodDBAdapter { return this; } - public void close() { - // do nothing + public synchronized void close() { + int adapters = counter.decrementAndGet(); + Log.v(TAG, "Closing DB #" + adapters); + if(adapters == 0) { + Log.v(TAG, "Closing DB, really"); + db.close(); + } } public static boolean deleteDatabase() { -- cgit v1.2.3 From 7f11cd351a2cfe776bad71ae29070a26af1e827f Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 23 Mar 2016 20:28:22 +0100 Subject: Refactor --- .../core/util/playback/PlaybackController.java | 139 ++++++++++----------- 1 file changed, 64 insertions(+), 75 deletions(-) (limited to 'core/src') 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 016ff9a85..f05b1f73b 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 @@ -50,19 +50,19 @@ public abstract class PlaybackController { private static final String TAG = "PlaybackController"; - public static final int INVALID_TIME = -1; + private static final int INVALID_TIME = -1; private final Activity activity; private PlaybackService playbackService; - protected Playable media; + private Playable media; private PlayerStatus status; - private ScheduledThreadPoolExecutor schedExecutor; + private final ScheduledThreadPoolExecutor schedExecutor; private static final int SCHED_EX_POOLSIZE = 1; - protected MediaPositionObserver positionObserver; - protected ScheduledFuture positionObserverFuture; + private MediaPositionObserver positionObserver; + private ScheduledFuture positionObserverFuture; private boolean mediaInfoLoaded = false; private boolean released = false; @@ -71,7 +71,7 @@ public abstract class PlaybackController { * True if controller should reinit playback service if 'pause' button is * pressed. */ - private boolean reinitOnPause; + private final boolean reinitOnPause; public PlaybackController(@NonNull Activity activity, boolean reinitOnPause) { @@ -86,8 +86,7 @@ public abstract class PlaybackController { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Log.w(TAG, - "Rejected execution of runnable in schedExecutor"); + Log.w(TAG, "Rejected execution of runnable in schedExecutor"); } } ); @@ -110,8 +109,7 @@ public abstract class PlaybackController { if (!released) { bindToService(); } else { - throw new IllegalStateException( - "Can't call init() after release() has been called"); + throw new IllegalStateException("Can't call init() after release() has been called"); } checkMediaInfoLoaded(); } @@ -203,27 +201,21 @@ public abstract class PlaybackController { */ private Intent getPlayLastPlayedMediaIntent() { Log.d(TAG, "Trying to restore last played media"); - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(activity.getApplicationContext()); - long currentlyPlayingMedia = PlaybackPreferences - .getCurrentlyPlayingMedia(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( + activity.getApplicationContext()); + long currentlyPlayingMedia = PlaybackPreferences.getCurrentlyPlayingMedia(); if (currentlyPlayingMedia != PlaybackPreferences.NO_MEDIA_PLAYING) { Playable media = PlayableUtils.createInstanceFromPreferences(activity, (int) currentlyPlayingMedia, prefs); if (media != null) { - Intent serviceIntent = new Intent(activity, - PlaybackService.class); + Intent serviceIntent = new Intent(activity, PlaybackService.class); serviceIntent.putExtra(PlaybackService.EXTRA_PLAYABLE, media); - serviceIntent.putExtra( - PlaybackService.EXTRA_START_WHEN_PREPARED, false); - serviceIntent.putExtra( - PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false); + serviceIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED, false); + serviceIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false); boolean fileExists = media.localFileAvailable(); - boolean lastIsStream = PlaybackPreferences - .getCurrentEpisodeIsStream(); + boolean lastIsStream = PlaybackPreferences.getCurrentEpisodeIsStream(); if (!fileExists && !lastIsStream && media instanceof FeedMedia) { - DBTasks.notifyMissingFeedMediaFile( - activity, (FeedMedia) media); + DBTasks.notifyMissingFeedMediaFile(activity, (FeedMedia) media); } serviceIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM, lastIsStream || !fileExists); @@ -257,7 +249,7 @@ public abstract class PlaybackController { } } - private ServiceConnection mConnection = new ServiceConnection() { + private final ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { playbackService = ((PlaybackService.LocalBinder) service) .getService(); @@ -265,7 +257,8 @@ public abstract class PlaybackController { queryService(); Log.d(TAG, "Connection to Service established"); } else { - Log.i(TAG, "Connection to playback service has been established, but controller has already been released"); + Log.i(TAG, "Connection to playback service has been established, " + + "but controller has already been released"); } } @@ -276,7 +269,7 @@ public abstract class PlaybackController { } }; - protected BroadcastReceiver statusUpdate = new BroadcastReceiver() { + private final BroadcastReceiver statusUpdate = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Received statusUpdate Intent."); @@ -286,66 +279,62 @@ public abstract class PlaybackController { media = info.playable; handleStatus(); } else { - Log.w(TAG, - "Couldn't receive status update: playbackService was null"); + Log.w(TAG, "Couldn't receive status update: playbackService was null"); bindToService(); } } }; - protected BroadcastReceiver notificationReceiver = new BroadcastReceiver() { + private final BroadcastReceiver notificationReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (isConnectedToPlaybackService()) { - int type = intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_TYPE, -1); - int code = intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_CODE, -1); - if (code != -1 && type != -1) { - switch (type) { - case PlaybackService.NOTIFICATION_TYPE_ERROR: - handleError(code); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE: - float progress = ((float) code) / 100; - onBufferUpdate(progress); - break; - case PlaybackService.NOTIFICATION_TYPE_RELOAD: - cancelPositionObserver(); - mediaInfoLoaded = false; - queryService(); - onReloadNotification(intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_CODE, -1)); - break; - case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE: - onSleepTimerUpdate(); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_START: - onBufferStart(); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_END: - onBufferEnd(); - break; - case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END: - onPlaybackEnd(); - break; - case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: - onPlaybackSpeedChange(); - break; - } - - } else { - Log.d(TAG, "Bad arguments. Won't handle intent"); - } - } else { + if (!isConnectedToPlaybackService()) { bindToService(); + return; + } + int type = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_TYPE, -1); + int code = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_CODE, -1); + if(code == -1 || type == -1) { + Log.d(TAG, "Bad arguments. Won't handle intent"); + return; + } + switch (type) { + case PlaybackService.NOTIFICATION_TYPE_ERROR: + handleError(code); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE: + float progress = ((float) code) / 100; + onBufferUpdate(progress); + break; + case PlaybackService.NOTIFICATION_TYPE_RELOAD: + cancelPositionObserver(); + mediaInfoLoaded = false; + queryService(); + onReloadNotification(intent.getIntExtra( + PlaybackService.EXTRA_NOTIFICATION_CODE, -1)); + break; + case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE: + onSleepTimerUpdate(); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_START: + onBufferStart(); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_END: + onBufferEnd(); + break; + case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END: + onPlaybackEnd(); + break; + case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: + onPlaybackSpeedChange(); + break; } } }; - private BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { + private final BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -499,7 +488,7 @@ public abstract class PlaybackController { * Called when connection to playback service has been established or * information has to be refreshed */ - void queryService() { + private void queryService() { Log.d(TAG, "Querying service info"); if (playbackService != null) { status = playbackService.getStatus(); @@ -729,7 +718,7 @@ public abstract class PlaybackController { * Returns true if PlaybackController can communicate with the playback * service. */ - public boolean isConnectedToPlaybackService() { + private boolean isConnectedToPlaybackService() { return playbackService != null; } -- cgit v1.2.3 From 6de985c99397edd3007c8d81847f5443f4c39687 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Wed, 23 Mar 2016 20:39:28 +0100 Subject: Replace AsyncTask with Observable --- .../core/util/playback/PlaybackController.java | 61 ++++++++++++---------- 1 file changed, 34 insertions(+), 27 deletions(-) (limited to 'core/src') 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 f05b1f73b..0ad286093 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 @@ -10,7 +10,6 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.media.MediaPlayer; -import android.os.AsyncTask; import android.os.Build; import android.os.IBinder; import android.preference.PreferenceManager; @@ -41,6 +40,10 @@ import de.danoeh.antennapod.core.service.playback.PlayerStatus; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.playback.Playable.PlayableUtils; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Communicates with the playback service. GUI classes should use this class to @@ -67,6 +70,8 @@ public abstract class PlaybackController { private boolean mediaInfoLoaded = false; private boolean released = false; + private Subscription serviceBinder; + /** * True if controller should reinit playback service if 'pause' button is * pressed. @@ -133,6 +138,9 @@ public abstract class PlaybackController { // ignore } + if(serviceBinder != null) { + serviceBinder.unsubscribe(); + } try { activity.unbindService(mConnection); } catch (IllegalArgumentException e) { @@ -165,34 +173,33 @@ public abstract class PlaybackController { */ private void bindToService() { Log.d(TAG, "Trying to connect to service"); - AsyncTask intentLoader = new AsyncTask() { - @Override - protected Intent doInBackground(Void... voids) { - return getPlayLastPlayedMediaIntent(); - } - - @Override - protected void onPostExecute(Intent serviceIntent) { - boolean bound = false; - if (!PlaybackService.started) { - if (serviceIntent != null) { - Log.d(TAG, "Calling start service"); - activity.startService(serviceIntent); - bound = activity.bindService(serviceIntent, mConnection, 0); + if(serviceBinder != null) { + serviceBinder.unsubscribe(); + } + serviceBinder = Observable.fromCallable(() -> getPlayLastPlayedMediaIntent()) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(intent -> { + boolean bound = false; + if (!PlaybackService.started) { + if (intent != null) { + Log.d(TAG, "Calling start service"); + activity.startService(intent); + bound = activity.bindService(intent, mConnection, 0); + } else { + status = PlayerStatus.STOPPED; + setupGUI(); + handleStatus(); + } } else { - status = PlayerStatus.STOPPED; - setupGUI(); - handleStatus(); + Log.d(TAG, "PlaybackService is running, trying to connect without start command."); + bound = activity.bindService(new Intent(activity, PlaybackService.class), + mConnection, 0); } - } else { - Log.d(TAG, "PlaybackService is running, trying to connect without start command."); - bound = activity.bindService(new Intent(activity, - PlaybackService.class), mConnection, 0); - } - Log.d(TAG, "Result for service binding: " + bound); - } - }; - intentLoader.execute(); + Log.d(TAG, "Result for service binding: " + bound); + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } /** -- cgit v1.2.3 From aa56d6822aee8a1a98555aa9c0203c3efd4608b5 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Mon, 21 Mar 2016 13:00:12 +0100 Subject: Added statistics function Fixes #1743 --- .../danoeh/antennapod/core/storage/DBReader.java | 82 ++++++++++++++++++++++ .../de/danoeh/antennapod/core/util/Converter.java | 12 ++++ core/src/main/res/values/strings.xml | 5 ++ 3 files changed, 99 insertions(+) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index 4f2400e1d..fd832a8cb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -917,6 +917,88 @@ public final class DBReader { return media; } + /** + * Searches the DB for statistics + * + * @return The StatisticsInfo object + */ + public static StatisticsData getStatistics() { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + + long totalTime = 0; + List feedTime = new ArrayList<>(); + + List feeds = getFeedList(); + for (Feed feed : feeds) { + long feedPlayedTime = 0; + long feedTotalTime = 0; + long episodes = 0; + long episodesStarted = 0; + List items = getFeed(feed.getId()).getItems(); + for(FeedItem item : items) { + FeedMedia media = item.getMedia(); + if(media == null) { + continue; + } + + if(item.isPlayed()) { + feedPlayedTime += media.getDuration() / 1000; + } else { + feedPlayedTime += media.getPosition() / 1000; + } + if(item.isPlayed() || media.getPosition() != 0) { + episodesStarted++; + } + feedTotalTime += media.getDuration() / 1000; + episodes++; + } + feedTime.add(new StatisticsItem( + feed, feedTotalTime, feedPlayedTime, episodes, episodesStarted)); + totalTime += feedPlayedTime; + } + + Collections.sort(feedTime, (item1, item2) -> { + if(item1.timePlayed > item2.timePlayed) { + return -1; + } else if(item1.timePlayed < item2.timePlayed) { + return 1; + } else { + return 0; + } + }); + + adapter.close(); + return new StatisticsData(totalTime, feedTime); + } + + public static class StatisticsData { + public long totalTime; + public List feedTime; + + public StatisticsData(long totalTime, List feedTime) { + this.totalTime = totalTime; + this.feedTime = feedTime; + } + } + + public static class StatisticsItem { + public Feed feed; + public long time; + public long timePlayed; + public long episodes; + public long episodesStarted; + + public StatisticsItem(Feed feed, long time, long timePlayed, + long episodes, long episodesStarted) { + this.feed = feed; + this.time = time; + this.timePlayed = timePlayed; + this.episodes = episodes; + this.episodesStarted = episodesStarted; + } + } + /** * Returns the flattr queue as a List of FlattrThings. The list consists of Feeds and FeedItems. * diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java index 5b046d7a7..70a180913 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java @@ -3,6 +3,8 @@ package de.danoeh.antennapod.core.util; import android.content.Context; import android.util.Log; +import java.util.Locale; + import de.danoeh.antennapod.core.R; /** Provides methods for converting various units. */ @@ -119,6 +121,16 @@ public final class Converter { return result; } + /** + * Converts seconds to a localized representation + * @param time The time in seconds + * @return "HH:MM hours" + */ + public static String shortLocalizedDuration(Context context, long time) { + float hours = (float) time / 3600f; + return String.format(Locale.getDefault(), "%.1f ", hours) + context.getString(R.string.time_hours); + } + /** * Converts the volume as read as the progress from a SeekBar scaled to 100 and as saved in * UserPreferences to the format taken by setVolume methods. diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 777db5046..d7948c0a3 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ AntennaPod Feeds + Statistics Add Podcast PODCASTS Episodes @@ -33,6 +34,10 @@ Recently published Show only new Episodes + + Total time of podcasts played: + %1$d out of %2$d episodes started.\n\nPlayed %3$s out of %4$s. + Open menu Close menu -- cgit v1.2.3 From 4cc31d4be97b35608771ddf7eabee98c9dc3252c Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 24 Mar 2016 11:52:51 +0100 Subject: Reset episode to new if episode file is added later --- core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java | 2 ++ core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'core/src') 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 b2192c66f..4921c0576 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 @@ -195,6 +195,8 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr if (other.media != null) { if (media == null) { setMedia(other.media); + // reset to new if feed item did link to a file before + setNew(); } else if (media.compareWithOther(other.media)) { media.updateFromOther(other.media); } 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 8a04e65ec..991499316 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -8,7 +8,6 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; -import android.text.TextUtils; import java.util.Date; import java.util.List; @@ -168,10 +167,6 @@ public class FeedMedia extends FeedFile implements Playable { } public void updateFromOther(FeedMedia other) { - // reset to new if feed item did link to a file before - if(TextUtils.isEmpty(download_url) && !TextUtils.isEmpty(other.download_url)) { - item.setNew(); - } super.updateFromOther(other); if (other.size > 0) { size = other.size; -- cgit v1.2.3 From 61e3d3b2a6bca599cdffe0038a91cc1d12febefa Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 24 Mar 2016 13:53:07 +0100 Subject: Close cursor --- core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index fc7d83978..67b0fa8a7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -592,6 +592,7 @@ public final class DBReader { Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId)); if (!itemCursor.moveToFirst()) { + itemCursor.close(); return null; } List list = extractItemlistFromCursor(adapter, itemCursor); -- cgit v1.2.3 From 47474737f5fa4bad1c152ef6323f37017a884db4 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 25 Mar 2016 00:36:23 +0100 Subject: Update config and translations --- core/src/main/res/values-ar/strings.xml | 128 +++++++ core/src/main/res/values-ca-rES/strings.xml | 33 ++ core/src/main/res/values-el/strings.xml | 358 +++++++++++++++++++ core/src/main/res/values-fi/strings.xml | 33 ++ core/src/main/res/values-hu/strings.xml | 33 ++ core/src/main/res/values-id/strings.xml | 33 ++ core/src/main/res/values-it/strings.xml | 290 ++++++++++++++++ core/src/main/res/values-kn-rIN/strings.xml | 103 ++++++ core/src/main/res/values-ko-rKR/strings.xml | 33 ++ core/src/main/res/values-no-rNB/strings.xml | 510 ++++++++++++++++++++++++++++ core/src/main/res/values-no/strings.xml | 33 ++ core/src/main/res/values-pl/strings.xml | 99 ++++++ core/src/main/res/values-vi-rVN/strings.xml | 33 ++ core/src/main/res/values-vi/strings.xml | 60 ++++ 14 files changed, 1779 insertions(+) create mode 100644 core/src/main/res/values-ar/strings.xml create mode 100644 core/src/main/res/values-ca-rES/strings.xml create mode 100644 core/src/main/res/values-el/strings.xml create mode 100644 core/src/main/res/values-fi/strings.xml create mode 100644 core/src/main/res/values-hu/strings.xml create mode 100644 core/src/main/res/values-id/strings.xml create mode 100644 core/src/main/res/values-it/strings.xml create mode 100644 core/src/main/res/values-kn-rIN/strings.xml create mode 100644 core/src/main/res/values-ko-rKR/strings.xml create mode 100644 core/src/main/res/values-no-rNB/strings.xml create mode 100644 core/src/main/res/values-no/strings.xml create mode 100644 core/src/main/res/values-pl/strings.xml create mode 100644 core/src/main/res/values-vi-rVN/strings.xml create mode 100644 core/src/main/res/values-vi/strings.xml (limited to 'core/src') diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml new file mode 100644 index 000000000..912f104b0 --- /dev/null +++ b/core/src/main/res/values-ar/strings.xml @@ -0,0 +1,128 @@ + + + + AntennaPod + الكل + المفضلات + جديد + قائمة انتظار + اعدادات + تنزيل + جارى التشغيل + اكتمل + سجل + الغاء التنزيل + + تم نشره مؤخرا + + قائمة الفتح + قائمة الاغلاف + ترتيب بالعداد + ترتيب بالابجدية + ترتيب بتاريخ النشر + الاعداد الجديدة + الاعداد غير المقرؤة + + افتح فى المتصفح + انسخ رابط الموقع + انشر رابط الموقع + تم نسخ الرابط للحافظة + اذهب لهذا الموقع + + + تأكيد + الغاء + نعم + لا + المؤلف + لغة + عنوان الموقع + اعدادات + صورة + خطاء + حدث خطاء + تحديث + لا توجد ذاكرة خارجية متاحة. فضلا تاكد من اتاحة الذاكرة الخارجية للتطبيق حتى يعمل بصورة جيدة + فصول + وصف + جارى المعالجة + جارى التحميل .... + حفظ اسم وكلمة المرور + اغلاق + اعادة المحاولة + تضمين فى التنزيل التلقائي + عام + دائما + ابدا + ارسال ... + ابدا + بعد الانتهاء + + + تعليمه ك تم تشغيله + تعليمه ك تم مشاهدته + اظهار المعلومات + مشاركة + مشاركة الرابط + تطبيق الاجراء + لم يتم تشغيله + ايقاف مؤقت + تم التنزيل + لم يتم التنزيل + + تشغيل + ايقاف مؤقت + ايقاف + مسح + تم تعليمه ك مشغل + تعليمه ك لم يتم تشغيله + اضافة للمفضلات + تم اضافته للمفضلات + المسح من المفضلات + تم مسحه من المفضلات + زيارة الموقع + تنزيل الكل + تفعيل التنزيل التلقائي + ايقاف التنزيل التلقائي + تم حزف العنصر + + نجحت العملية + فشلت العملية + التنزيل فى الانتظار + جارى التنزيل + حهاز التخزين غير موجود + مساحة غير كافية + خطاء فى الملف + خطاء فى بيانات HTTP + خطاء غير معروف + خطاء فى الاتصال + المضيف غير معروف + خطاء فى التحقق + + خطاء غير معروف + + تم حزف العنصر + + + + + + + + + + + + + + الاعداد غير المقرؤة + + + + الكل + لم يتم تشغيله + تم التنزيل + لم يتم التنزيل + + + diff --git a/core/src/main/res/values-ca-rES/strings.xml b/core/src/main/res/values-ca-rES/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-ca-rES/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-el/strings.xml b/core/src/main/res/values-el/strings.xml new file mode 100644 index 000000000..60a3213b8 --- /dev/null +++ b/core/src/main/res/values-el/strings.xml @@ -0,0 +1,358 @@ + + + + AntennaPod + Ροές + PODCASTS + Επεισόδια + Νέα Επεισόδια + Όλα τα Επεισόδια + Όλα + Αγαπημένα + Νέα + Ρυθμίσεις + Λήψεις + Εκτέλεση + Ολοκληρώθηκε + Είσοδος + Ιστορικό Αναπαραγωγής + gpodder.net + gpodder.net Σύνδεση + + Πρόσφατα δημοσιεύθηκε + Εμφάνιση μόνο νέων Επεισοδίων + + Άνοιγμα μενού + Κλείσιμο μενού + Ταξινόμηση αλφαβητικά + Ταξινόμηση κατά ημερομηνία δημοσίευσης + Αριθμός νέων επεισοδίων + + Άνοιγμα στον Περιηγητή + Αντιγραφή διεύθυνσης URL + Μοιρασμα URL + Αντιγραφή URL στο Πρόχειρο + + Εκκαθάριση Ιστορικού + + Επιβεβαίωση + Ακύρωση + Δημιουργος + Γλωσσα + Ρυθμισεις + Εικονα + Σφαλμα + Παρουσιάστηκε ένα σφάλμα: + Ανανέωση + Καμία εξωτερική αποθήκευση είναι διαθέσιμη. Παρακαλώ βεβαιωθείτε ότι η εξωτερική αποθήκευση έχει τοποθετηθεί έτσι ώστε η εφαρμογή να μπορεί να λειτουργήσει σωστά. + Κεφάλαια + Εμφάνιση Σημειώσεων + Περιγραφή + \u0020επεισοδια + Μήκος:\u0020 + Μέγεθος:\u0020 + Επεξεργασία + Αποθήκευση του όνοματος χρήστη και του κωδικόυ πρόσβασης + Κλείσιμο + Επανάληψη + Συμπερίληψη στην αυτόματη λήψη + \u0020παράλληλες λήψεις + Πάντα + Ποτέ + Ποτέ + + URL της Ροής + www.example.com/feed + Προσθήκη Podcast με τη διεύθυνση URL + Μπορείτε να ψάξετε για νέα podcast από το όνομα, κατηγορία ή δημοτικότητα στον κατάλογο του iTunes. + Περιήγηση στο gpodder.net + + Εμφάνιση πληροφοριών + Κατάργηση Podcast + Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράφθουν αυτες οι τροφοδοσιες και όλα τα επεισόδια του υλικού αυτού που έχετε κανει λήψη. + Απόκρυψη Επεισοδίων + Ειλημμένα + {fa-exclamation-circle} Η Τελευταία Ανανέωση Απέτυχε + + Λήψη + Αναπαραγωγή + Παύση + Στοπ + Ροή + Κατάργηση + Προσθήκη σε αναμονή κλήσης + Κατάργηση απο την αναμονή κλήσης + Προσθήκη στα Αγαπημένα + Προσθήκη από τα Αγαπημένα + Επισκεφθείτε την ιστοσελίδα + Flattr αυτό + Τοποθέτηση στην αναμονή ολων + Λήψη όλων + Μετάβαση επεισοδίων + Ενεργοποίηση Αυτόματης Λήψης + Απενεργοποίηση Αυτόματης Λήψης + Επαναφορά Θέσης Αναπαραγωγής + + επιτυχής + απέτυχε + Λήψη σε εκκρεμότητα + Λήψη εν λειτουργία + Η Συσκευή Αποθήκευσης δεν υπάρχει + Σφάλμα Αρχείου + Σφάλμα HTTP Δεδομένων + Άγνωστο σφάλμα + Αναλυτής εξαίρεσης + Σφάλμα Σύνδεσης + Σφάλμα Αυθεντικοποίησης + Ακύρωση όλων των λήψεων + Η Λήψη ακυρώθηκε + Οι Λήψεις ολοκληρώθηκαν με σφάλμα(τα) + Αναφορά Λήψεων + Εσφαλμένη διεύθυνση URL + IO Σφαλμα + Σφάλμα Πρόσβασης Βάσης Δεδομένων + Λήψη Επεξεργασίας + Λήψη podcast δεδομένων + %1$d λήψη πέτυχε, %2$d απέτυχε + Άγνωστος Τίτλος + Τροφοδοσία + Αρχείο πολυμέσων + Εικόνα + Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια να κάνετε λήψη του αρχείου: \ u0020 + Απαιτείται έλεγχος ταυτότητας + Ο πόρος που ζητήσατε απαιτεί ένα όνομα χρήστη και έναν κωδικό πρόσβασης + Τοποθέτηση στην ουρά αναμονής + + Σφάλμα! + Δεν απαραγωνται πολυμεσα + Προετοιμασία + Έτοιμοι + Αναζητηση + Ο διακομιστής πέθανε + Άγνωστο σφάλμα + Δεν απαραγωνται πολυμεσα + 00:00:00 + Προσωρινή μνήμη + Αναπαραγωγή του podcast + AntennaPod - Άγνωστα πλήκτρα πολυμέσων: %1$d + + Κλείδωμα Ουράς Αναμονής + Ξεκλείδωμα Ουράς Αναμονής + Εκκαθάριση Ουράς Αναμονής + Αναίρεση + Στοιχεία αφαιρούνται + Μετακίνηση στην κορυφή + Μετακίνηση προς τα κάτω + Ταξινόμηση + Αλφαβητικά + Ημερομηνία + Δάρκεια + Αύξουσα + Φθίνουσα + Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράψετε την ουρά όλων των επεισοδίων σε αυτό + + Flattr σύνδεση + Πατήστε το κουμπί παρακάτω για να ξεκινήσει η διαδικασία ελέγχου ταυτότητας. Θα πρέπει να διαβιβάζονται στην οθόνη σύνδεσης Flattr στον browser σας και να σας ζητηθεί να δώσει AntennaPod την άδεια να Flattr πράγματα. Αφού έχετε δώσει την άδεια, θα επιστρέψετε σε αυτήν την οθόνη αυτόματα. + Έλεγχος + Επιστροφή στην αρχική σελίδα + Έλεγχος ταυτότητας ήταν επιτυχής! Μπορείτε τώρα να Flattr πράγματα μέσα από την εφαρμογή. + Δεν βρέθηκε Flattr διακριτικό + Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Πατήστε εδώ για να επικυρωθει. + Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Μπορείτε είτε να συνδέσετε το λογαριασμό σας στο AntennaPod να Flattr πράγματα μέσα από την εφαρμογή ή μπορείτε να επισκεφθείτε την ιστοσελίδα του πράγματος για Flattr εκεί + Έλεγχος + Δράση απαγορεύεται + Το AntennaPod δεν έχει άδεια για τη δράση αυτή. Ο λόγος ειναι οτι θα μπορούσε να είναι ότι το διακριτικό πρόσβασης του AntennaPod στο λογαριασμό σας έχει ανακληθεί. Μπορείτε να κανετε εκ νέου τον ελεγχο ταυτοποιησης ή επισκεφθείτε την ιστοσελίδα του πράγματος. + Πρόσβαση ανακαλείται + Έχετε ανακαλέσει επιτυχώς διακριτικό πρόσβασης AntennaPod στον λογαριασμό σας. Για να ολοκληρωθεί η διαδικασία, θα πρέπει να αφαιρέσετε αυτή η εφαρμογή από τον κατάλογο των εγκεκριμένων αιτήσεων στις ρυθμίσεις του λογαριασμού σας στην Flattr ιστοσελίδα. + + Flattr\'ed ένα πράγμα! + Flattr\'ed%d πράγματα! + Flattr\'ed: %s. + Αποτυχία Flattr%d πράγματα! + Οχι flattr\'ed: %s. + Πράγμα θα flattr\'ed αργότερα + Flattring %s + Το AntennaPod είναι flattring + Το AntennaPod έχει flattr\'ed + AntennaPod Flattr απέτυχε + Ανάκτηση flattr\'ed πραγμάτων + + Λήψη Πρόσθετου + Το Πρόσθετο δεν είναι εγκατεστημένο + Ταχύτητες αναπαραγωγής + + Δεν υπάρχουν στοιχεία σε αυτή τη λίστα. + Δεν έχετε εγγραφεί σε οποιεσδήποτε τροφοδοσίες ακόμα + + Άλλα + Σχετικά με + Σειρά αναμονής + Υπηρεσίες + Flattr + Συνέχιση της αναπαραγωγής, όταν τα ακουστικά επανασυνδέονται + Μετάβαση στο επόμενο στοιχείο σειράς αναμονής όταν η αναπαραγωγή ολοκληρωθεί + Διαγραφή επεισοδίων όταν η αναπαραγωγή ολοκληρωθεί + Αυτόματη διαγραφή + Αναπαραγωγή + Δίκτυο + Λήψη αρχείων πολυμέσων μόνο μέσω WiFi + WiFi λυψη πολυμεσων + Να επιτρέπονται ενημερώσεις μέσω της σύνδεσης δεδομένων κινητής τηλεφωνίας + Ανανεωση + Flattr Ρυθμισεις + Flattr Συνδεση + Συνδεθείτε στον Flattr λογαριασμό σας για να Flattr πράγματα απευθείας από την εφαρμογή. + Υποστήριξη της ανάπτυξης του AntennaPod flattring αυτό. Ευχαριστούμε! + Ανάκληση πρόσβασης + Ανακληση της άδειας πρόσβασης στον Flattr λογαριασμό για αυτη την εφαρμογή. + Αυτόματο Flattr + Διαμόρφωση αυτόματου flattring + Περιβάλλον χρήστη + Αλλαγή της εμφάνισης του AntennaPod. + Ρύθμιση της αυτόματης λήψης των επεισοδίων. + Ενεργοποίηση Wi-Fi φίλτρου + Να επιτρέπεται η αυτόματη λήψη μόνο στα επιλεγμένα δίκτυα Wi-Fi. + Λήψη όταν δεν φορτίζει + Επιτρέψετε την αυτόματη λήψη όταν η μπαταρία δεν φορτίζει + Φως + Σκοτάδι + Απεριόριστα + ώρες + ώρα + Εγχειρίδιο + Σύνδεση + Σύνδεση με τον λογαριασμό σας στο gpodder.net σας για να συγχρονίσετε τις συνδρομές σας. + Αποσύνδεση + Η Αποσύνδεση ήταν επιτυχής + Αλλαγή στοιχείων σύνδεσης + Αλλαγή στοιχείων σύνδεσης για το λογαριασμό σας στο gpodder.net. + Ταχύτητα αναπαραγωγής + Προσαρμόστε τις διαθέσιμες ταχύτητες για αναπαραγωγή ήχου μεταβλητής ταχύτητας + Ορισμός κεντρικού υπολογιστή + Χρήση προεπιλεγμένης υποδοχής + Ανάπτυξη κοινοποίησης + Πάντα επέκταση της ειδοποίησης για εμφανιση κουμπιων αναπαραγωγής. + Διατηρηση των ελέγχων κοινοποίησης και lockscreen όταν γίνεται παύση της αναπαραγωγής. + Εκδόσεις του Android πριν από το 4.1 δεν υποστηρίζουν εκτεταμένες κοινοποιήσεις. + Προσθήκη νέων επεισοδίων στο μπροστινό μέρος της ουράς. + Τοποθέτηση στην Αρχή της Ουράς + Πειραματικό + + Ενεργοποίηση αυτόματου flattring + Flattr επεισόδιο συντομότερο απο %d τοις εκατό έχει παιχτεί + Flattr επεισόδιο όταν αρχίζει η αναπαραγωγή + Flattr επεισόδιο όταν ολοκληρωθεί η αναπαραγωγή του + + Αναζήτηση για Τροφοδοσίες ή Επεισόδια + Βρέθηκε στις σημειώσεις + Βρέθηκε σε κεφάλαια + Δεν βρέθηκαν αποτελέσματα + Αναζήτηση + Βρέθηκε στον τίτλο + + Τα OPML αρχεία σας επιτρέπουν να μετακινήσετε τα podcast από το ένα στο άλλο podcatcher. + Επιλέξτε μια συγκεκριμένη διαδρομή αρχείου από το τοπικό σύστημα αρχείων. + Χρησιμοποιήστε μια εξωτερική εφαρμογη όπως το Dropbox, το Google Drive ή τον αγαπημένο σας διαχειριστή αρχείων για να ανοίξετε ένα αρχείο OPML. + Πολλές από τις εφαρμογές όπως το Google Mail, Dropbox, το Google Drive και οι περισσότεροι διαχειριστές αρχείων μπορούν να <i> ανοικτό </ i> Τα αρχεία OPML <i> με </ i> AntennaPod. + Εναρξη εισαγωγής + Εισαγωγή OPML + ΣΦΑΛΜΑ! + Ανάγνωση αρχείου OPML + Παρουσιάστηκε σφάλμα κατά την ανάγνωση του εγγράφου OPML: + Ο κατάλογος εισαγωγής είναι άδειος. + Επιλογή όλων + Αποεπιλογή όλων + Από το τοπικό σύστημα αρχείων + Χρησιμοποιήστε εξωτερική εφαρμογή + OPML εξαγωγή + Σφάλμα κατά την εξαγωγή + Η Εξαγωγή OPML είναι επιτυχής + Το αρχείο .opml συντάχθηκε για:\u0020 + + Ρύθμιση του χρονοδιακόπτη ύπνου + Απενεργοποίηση χρονοδιακόπτη ύπνου + Εισαγωγη χρονου + Χρονοδιακόπτης ύπνου + Χρόνος που απομένει:\u0020 + Μη έγκυρη εισαγωγή, ο χρόνος πρέπει να είναι ακέραιος + δευτερόλεπτα + λεπτά + ώρες + + ΚΑΤΗΓΟΡΙΕΣ + ΚΟΡΥΦΑΙΑ PODCAST + ΠΡΟΤΑΣΕΙΣ + Αναζήτηση στο gpodder.net + Σύνδεση + Καλώς ήρθατε στη διαδικασία σύνδεσης με το gpodder.net. Πρώτον, πληκτρολογήστε τα στοιχεία σύνδεσής σας: + Σύνδεση + Εάν δεν έχετε ακόμα λογαριασμό, μπορείτε να δημιουργήσετε έναν εδώ:\nhttps://gpodder.net/register/ + Όνομα Χρήστη + Κωδικός + Επιλογή συσκευής + Δημιουργήστε μια νέα συσκευή που θα χρησιμοποιηθεί για λογαριασμό του gpodder.net ή επιλέξτε μια ήδη υπάρχουσα: + Αναγνωριστικό συσκευής:\u0020 + Επικεφαλίδα + Δημιουργία νέας συσκευής + Επιλογή υπάρχουσας συσκευής: + Το Αναγνωριστικό συσκευής δεν πρέπει να είναι κενό + Το Αναγνωριστικό συσκευής ειναι ήδη σε χρήση + Επιλογή + Είσοδος επιτυχής! + Συγχαρητήρια! Ο Λογαριασμός σας στο gpodder.net συνδέεται πλέον με τη συσκευή σας. Το AntennaPod θα συγχρονίζει αυτόματα τις συνδρομές στην συσκευή σας με το λογαριασμό σας στο gpodder.net. + Έναρξη συγχρονισμού τώρα + Μετάβαση στην κύρια οθόνη + gpodder.net σφάλμα ελέγχου ταυτότητας + Λάθος όνομα χρήστη ή κωδικός πρόσβασης + gpodder.net σφάλμα συγχρονισμού + Παρουσιάστηκε σφάλμα κατά το συγχρονισμό:\u0020 + + Επιλεγμένος φάκελος: + Δημιουργία φακέλου + Δημιουργία νέου φακέλου με το όνομα \"%1$s\"; + Δημιουργήθηκε ο νέος φάκελος + Δεν είναι δυνατή η εγγραφή σε αυτόν το φάκελο + Ο φάκελος ήδη υπάρχει + Δεν ήταν δυνατή η δημιουργία φακέλου + Ο φάκελος δεν είναι άδειος + Ο φάκελος που επιλέξατε δεν είναι άδειος. Λήψεις πολυμεσων και άλλων αρχείων, θα τοποθετουνται απευθείας σε αυτό τον φάκελο. Θέλετε να συνεχίσετε; + Επιλογή προεπιλεγμένου φακέλου + Παύση της αναπαραγωγής, αντί της μείωσης έντασης όταν μια άλλη εφαρμογή θέλει να αναπαράξει ήχους + Παύση για διακοπές + Συνέχιση της αναπαραγωγής, μετά το πέρας τηλεφωνικής κλήσης + Συνέχιση της αναπαραγωγής, μετά από Κλήση + Το AntennaPod χρειάζεται επανεκκίνηση για την εφαρμογή των αλλαγών. + + Εγγραφή + Εγγεγραμμένα + + Εμφάνιση κεφαλαίων + Εμφάνιση σημειώσεων + Εμφάνιση εικόνας + Κίνηση εμπρός + Γρήγορη κίνηση εμπρός + Ήχος + Βίντεο + Πλοήγηση προς τα πάνω + Περισσότερες ενέργειες + Το επεισόδιο αναπαράγεται + Το επεισόδιο γίνεται λήφθετε + Το επεισόδιο εχει ληφθει + Το Στοιχείο είναι νέο + Το επεισόδιο είναι στη σειρά αναμονής + Αριθμός νέων επεισοδίων + Αριθμός επεισοδίων που έχετε αρχίσει να ακούτε + Σύρετε για να αλλάξετε τη θέση αυτού του στοιχείου + Τοποθέτηση επόμενης σελίδας + + Πιστοποίηση + Αλλαγή του όνοματος χρήστη και του κωδικόυ πρόσβασής για αυτό το podcast και τα επεισόδια του. + + + Εισαγωγή εγγραφών από εφαρμογές και μονο... + iTunes Αναζήτηση + Όλα + Ειλημμένα + + + diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-fi/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-hu/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-id/strings.xml b/core/src/main/res/values-id/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-id/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..84f60ab38 --- /dev/null +++ b/core/src/main/res/values-it/strings.xml @@ -0,0 +1,290 @@ + + + + AntennaPod + Feed + Aggiungi un podcast + PODCAST + Episodi + Episodi nuovi + Tutti gli episodi + Tutto + Preferiti + Nuovo + Lista d\'attesa + Impostazioni + Aggiungi un podcast + Download + In corso + Completati + Registro + Annulla\nil download + Cronologia delle riproduzioni + gpodder.net + Accesso a gpodder.net + + Pubblicati di recente + + Apri il menù + Chiudi il menù + Ordina alfabeticamente + Ordina secondo la data di pubblicazione + Numero di episodi nuovi + Numero di episodi non riprodotti + + Apri nel browser + Copia l\'URL + Condividi l\'URL + + + Conferma + Annulla + + No + Autore + Lingua + URL + Impostazioni + Immagine + Errore + È avvenuto un errore: + Ricarica + Capitoli + Descrizione + \u0020episodi + Lunghezza:\u0020 + Dimensione:\u0020 + Processando + Salva il nome utente e la password + Chiudi + Riprova + Includi nei download automatici + Applica agli episodi precedenti + \u0020download paralleli + Globale + Sempre + Mai + Mai + Dopo il completamento + + 1 giorno dopo il completamento + %d giorni dopo il completamento + + + URL del feed + www.example.com/feed + Aggiungi un podcast inserendo un URL + Puoi cercare nuovi podcast per nome, categoria o popolarità su gpodder.net, oppure sull\'iTunes store. + Esplora gpodder.net + + Segna tutti come riprodotti + Conferma che desideri segnare tutti gli episodi come riprodotti. + Conferma che desideri segnare tutti gli episodi in questo feed come riprodotti. + Mostra delle informazioni + Conferma che desideri cancellare questo feed e TUTTI gli episodi di questo feed che hai scaricato. + Nascondi gli episodi + Applica le azioni + Non riprodotti + In pausa + Riprodotto + In coda + Non in coda + Scaricato + Non scaricato + Filtrato + + Scarica + Riproduci + Metti in pausa + Interrompi + Stream + Rimuovi + Segna come riprodotto + Segnato come riprodotto + Segna come non riprodotto + Aggiungi alla coda + Aggiunto alla Coda + Rimuovi dalla coda + Visita il sito web + Metti tutti in coda + Scarica tutti + Salta l\'episodio + + successo + fallito + Download in attesa + Download in corso + Errore dei dati HTTP + Errore sconosciuto + Annulla tutti i download + Download annullato + Download annullato\nDisabilitato Download Automatico per questo elemento + URL malformato + Errore IO + Download dei dati del podcast in corso + %1$d download hanno avuto successo, %2$d hanno fallito + Feed + File multimediale + Immagine + Si è verificato un errore nello scaricare il file:\u0020 + Autenticazione richiesta + La risorsa che hai richiesto richiede un nome utente e una password + + Errore! + Nessun elemento multimediale in riproduzione + Preparazione in corso + Pronto + Ricerca in corso + Server morto + Errore sconosciuto + Nessun elemento multimediale in riproduzione + 00:00:00 + Buffer in corso + Riproduzione del podcast in corso + + Annulla + Oggetto rimosso + Sposta in cima + Sposta in fondo + Ordina + In ordine alfabetico + Data + Durata + Ascendente + Discendente + + Accesso a Flattr + Autentica + Ritorna alla pagina iniziale + Il tuo account flattr non sembra connesso ad AntennaPod. Clicca qui per accedere. + Autentica + Azione proibita + Accesso revocato + + + Scarica plugin + Plugin non installato + Velocità di riproduzione + + Non ci sono oggetti in questo elenco. + Non sei ancora iscritto a nessun feed. + + Altro + Riguardo a + Coda + Servizi + Flattr + Riprendi la riproduzione quando le cuffie vengono ricollegate + Salta all\'elemento successivo della lista al termine della riproduzione + Elimina l\'episodio al termine della riproduzione + Eliminazione Automatica + Riproduzione + Rete + Permetti gli aggiornamenti su rete dati + Ricaricamento + Accesso a Flattr + Revoca l\'accesso + Interfaccia utente + Cambia l\'aspetto di AntennaPod + Abilita il filtro Wi-Fi + Scarica automaticamente quando la batteria non è in caricamento + Chiaro + Scuro + Illimitato + ore + ora + Manuale + Accesso + Esci + Cambia le informazioni di accesso + Velocità di riproduzione + Imposta il nome dell\'host + Utilizza l\'host predefinito + Espandi le notifiche + Aggiungi un nuovo episodio in testa alla coda. + Disabilitato + + + Cerca dei feed o degli episodi + Trovato nei capitoli + Nessun risultato trovato + Cerca + Trovato nel titolo + + Avvia l\'importazione + ERRORE! + La directory dell\'importazione è vuota. + Seleziona tutto + Deseleziona tutto + Usa un\'applicazione esterna + Esportazione OPML + Errore di esportazione + + Imposta timer per lo spegnimento + Disabilta timer per lo spegnimento + Timer per lo spegnimento + Tempo rimasto:\u0020 + Input non valido, il tempo deve essere un numero intero + + CATEGORIE + PODCAST PIÙ POPOLARI + SUGGERIMENTI + Cerca su gpodder.net + Accesso + Benvenuto nella procedura di accesso a gpodder.net. Per prima cosa, inserisci i tuoi dati di accesso: + Accesso + Se non hai ancora un account , puoi crearne uno su:\nhttps://gpodder.net/register/ + Nome utente + Password + Selezione del dispositivo + ID del dispositivo:\u0020 + Crea un nuovo dispositivo + Scegli un dispositivo esistente: + L\'ID del dispositivo non può essere vuoto + ID del dispositivo già in uso + Scegli + Accesso avvenuto con successo! + Avvia ora la sincronizzazione + Vai alla schermata principale + errore di autenticazione di gpodder.net + Nome utente o password errati + errore di sincronizzazione di gpodder.net + È avvenuto un errore durante la sincronizzazione:\u0020 + + Cartella selezionata: + Crea una cartella + Creare una nuova cartella dal nome \"%1$s\"? + Creata una nuova cartella + Non è possibile scrivere in questa cartella + La cartella esiste già + Non è stato possibile creare la cartella + La cartella non è vuota + Scegli la cartella predefinita + + Abbonati + Abbonato + + Mostra i capitoli + Mostra l\'immagine + Riavvolgi + Avanti veloce + Audio + Video + Altre azioni + L\'episodio sta venendo riprodotto + L\'episodio sta venendo scaricato + L\'episodio è stato scaricato + L\'oggetto è nuovo + L\'episodio è in coda + Numero di episodi nuovi + Numero di episodi che hai iniziato ad ascoltare + Carica la pagina successiva + + Autenticazione + + + Cerca su iTunes + Tutto + + + diff --git a/core/src/main/res/values-kn-rIN/strings.xml b/core/src/main/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..c95dfba8d --- /dev/null +++ b/core/src/main/res/values-kn-rIN/strings.xml @@ -0,0 +1,103 @@ + + + + ಆಂಟೆನಾಪಾಡ್ + ಫೀಡ್ಗಳು + ಹೊಸ + ಸೆಟ್ಟಿಂಗ್ಗಳು + ಇಳಿಕೆಗಳು + + + + + + ದೃಢೀಕರಿಸಿ + ರದ್ದುಗೊಳಿಸು + ಲೇಖಕ + ಭಾಷೆ + ದೋಷ + ದೋಷ ಕಂಡುಬಂದಿದೆ: + ತಾಜಾ + ಬಾಹ್ಯ ಸಂಗ್ರಹ ಲಭ್ಯವಿಲ್ಲ. ಅಪ್ಲಿಕೇಶನ್ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡಲು, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಆರೋಹಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ + ಅಧ್ಯಾಯಗಳು + ಟಿಪ್ಪಣಿಗಳು + \u0020ಕಂತುಗಳು + ಉದ್ದ:\u0020 + ಗಾತ್ರ:\u0020 + ಸಂಸ್ಕರಣೆ + + ಫೀಡ್ ಯು.ಆರ್.ಎಲ್ + + ಮಾಹಿತಿ ತೋರಿಸು + ನೀವು ಈ ಫೀಡ್ ಮತ್ತು ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಈ ಫೀಡ್ನ ಎಲ್ಲಾ ಕಂತುಗಳು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ದಯವಿಟ್ಟು ದೃಢಪಡಿಸಿ. + + ಡೌನ್ಲೋಡ್ + ಚಾಲನೆಗೊಳಿಸು + ಹೊಳೆ + ತೆಗೆದುಹಾಕಿ + ಸರದಿಗೆ ಸೇರಿಸಿ + ಸರದಿಯಿಂದ ತೆಗೆದುಹಾಕಿ + ಜಾಲತಾಣವನ್ನು ಭೇಟಿಮಾಡಿ + ಫ್ಲಾಟರ್ ಮಾಡಿ + + ಡೌನ್ಲೋಡ್ ಬಾಕಿ ಉಳಿದಿದೆ + ಚಾಲನೆಯಲ್ಲಿರುವ ಡೌನ್ಲೋಡ್ + ಎಚ್ಟಿಟಿಪಿ ಮಾಹಿತಿ ದೋಷ + ತಿಳಿಯದ ದೋಷ + ಪಾರ್ಸರ್ ಎಕ್ಸೆಪ್ಶನ್ + ಎಲ್ಲಾ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ರದ್ದು ಮಾಡು + ದೋಷಪೂರಿತ ಯು.ಆರ್.ಎಲ್ + ಐಓ ದೋಷ + + ದೋಷ! + ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ + ಸಿದ್ಧತೆ + ಸಿದ್ಧ + ಅರಸುತ್ತಿರುವ + ಸರ್ವರ್ ಸತ್ತಿದೆ + ತಿಳಿಯದ ದೋಷ + ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ + 00:00:00 + ತುಣಿಗಲೆಯಾಗುತ್ತಿದೆ + + + ಫ್ಳಟರ್ ಪ್ರವೇಶ + ದೃಢೀಕರಣ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಆರಂಭಿಸಲು ಕೆಳಗಿನ ಬಟನ್ ಒತ್ತಿರಿ. ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ ನೀವು ಫ್ಳಟರ್ ಪ್ರವೇಶ ತೆರೆಗೆ ರವಾನಿಸಲ್ಪಡುತ್ತೀರಿ ಮತ್ತು ಆಂಟೆನಾ-ಪಾಡ್ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಲು ಅನುಮತಿ ನೀಡಲು ಕೇಳಲಾಗುತ್ತದೆ. ನೀವು ಅನುಮತಿ ನೀಡಿದ ನಂತರ, ನೀವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಈ ಪರದೆಗೆ ಮರಳಬಹುದು. + ದೃಢೀಕರಿಸು + ಮುಂಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ + ದೃಢೀಕರಣ ಯಶಸ್ವಿಯಾಯಿತು! ನೀವು ಈಗ ಅಪ್ಲಿಕೇಶನ್ ಒಳಗೆ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಬಹುದು. + ಫ್ಳಟರ್ ಟೋಕನ್ ಕಂಡುಬಂದಿಲ್ಲ + ದೃಢೀಕರಿಸು + ಕ್ರಿಯೆಯನ್ನು ನಿಷೇಧಿಸಲಾಗಿದೆ + ಪ್ರವೇಶವನ್ನು ಹಿಂಪಡೆಯಲಾಗಿದೆ + + + + ಈ ಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಅಂಶಗಳು ಇಲ್ಲ. + ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಫೀಡ್ಗಳಿಗೆ ಚಂದಾದಾರರಾಗಿಲ್ಲ. + + ಇತರೆ + ಕುರಿತು + ಸರದಿ + ಹಿನ್ನೆಲೆ + ಜಾಲಬಂಧ + ಬಳಕೆದಾರ ಸಂಪರ್ಕಸಾಧನ + + + ಫೀಡ್ಸ್ ಅಥವಾ ಸಂಚಿಕೆಗಳಿಗಾಗಿ ಹುಡುಕಿ + ಪ್ರದರ್ಶನ ಟಿಪ್ಪಣಿಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ + ಅಧ್ಯಾಯಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ + ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ + ಹುಡುಕು + + + + + + + + + + + + diff --git a/core/src/main/res/values-ko-rKR/strings.xml b/core/src/main/res/values-ko-rKR/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-ko-rKR/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-no-rNB/strings.xml b/core/src/main/res/values-no-rNB/strings.xml new file mode 100644 index 000000000..e3aa1ca5d --- /dev/null +++ b/core/src/main/res/values-no-rNB/strings.xml @@ -0,0 +1,510 @@ + + + + AntennaPod + Strømmer + Legg til podcast + PODCASTER + Episoder + Nye episoder + Alle episoder + Alle + Favoritter + Nye + Venteliste + Innstillinger + Legg til podcast + Nedlastninger + Kjører + Fullført + Logg + Avbryt\nLast ned + Avspillingshistorikk + gpodder.net + gpodder.net-innlogging + %1$s ledig + + Nylig publisert + Vis kun nye episoder + + Åpne menyen + Lukk menyen + Skuff-innstillinger + Sorter på teller + Sorter alfabetisk + Sorter på utgivelsesdato + Antall nye og uavspilte episoder + Antall nye episoder + Antall uavspilte episoder + Ingen + + Åpne i nettleser + Kopier URL + Del URL + URL er kopiert til utklippstavlen + Gå til denne posisjonen + + Tøm historikk + + Bekreft + Avbryt + Ja + Nei + Opphavsperson + Språk + URL + Innstillinger + Bilde + Feil + Det oppsto en feil: + Oppdater + Finner ikke ekstern lagring. Sjekk at det eksterne lagringsmediet er montert. + Kapittel + Shownotater + Beskrivelse + Nyeste episode:\u0020 + \u0020episoder + Lengde:\u0020 + Størrelse:\u0020 + Behandler + Lagre brukernavn og passord + Lukk + Prøv igjen + Inkluder i automatiske nedlastninger + Angi for tidligere episoder + Den nye Automatisk nedlasting-innstillingen vil automatisk aktiveres for nye episoder.\nØnsker du å aktivere den for tidligere utgitte episoder også? + Automatisk sletting av episode\n(overstyr den globale standarden) + \u0020samtidige nedlastinger + Global + Alltid + Aldri + AldriAldri + Når ikke i kø + Etter den er ferdig + + 1 dag etter fullført avspilling + %d dager etter fullført avspilling + + + Strømmens URL + www.example.com/feed + Legg til en podcast via URL + Finn podcast i katalog + Du kan søke etter nye podcaster på navn, kategori eller popularitet i gpodder.nets katalog eller på iTunes. + Bla gjennom gpodder.net + + Marker alle som avspilt + Marker alle episoder som avspilt + Vennligst bekreft at du ønsker å markere alle episoder som avspilt. + Vennligst bekreft at du ønsker å markere alle episoder i denne strømmen som avspilt. + Marker alle som sett + Vis informasjon + Fjern podcast + Del lenke + Del lenke med plassering + Del strømmens URL + Del episodens URL + Del episodens URL med posisjon + Vil du virkelig slette denne strømmen og alle episodene av denne strømmen du har lastet ned? + Fjerner strøm + Oppdater hele strømmen + Skjul episoder + Lagre handlinger + Ikke avspilt + Pauset + Avspilt + I kø + Ikke i kø + Nedlastet + Ikke nedlastet + Filtrert + {fa-exclamation-circle} Siste oppdatering mislyktes + + Last ned + Spill + Pause + Stopp + Stream + Fjern + Fjern episode + Marker som avspilt + Marker som avspilt + Marker som ikke avspilt + Legg til queue + Lagt til i kø + Fjern fra queue + Legg til i favoritter + Fjern fra favoritter + Besøk nettside + Flattr\'e dette + Legg alle til queue + Last ned alle + Skip episode + Aktiver automatisk nedlasting + Deaktiver automatisk nedlasting + Tilbakestill avspillingsposisjon + Element fjernet + + nedlastning lyktes + mislyktes + Nedlastning venter + Nedlasting pågår + Lagringsenhet ikke funnet + Ikke nok plass + Fil-feil + HTTP-datafeil + Ukjent feil + Parser-unntak + Strøm-typen er ikke støttet + Tilkoblingsfeil + Ukjent vert + Autentiseringsfeil + Avbryt alle nedlastninger + Nedlasting avbrutt + Nedlasting avbrutt\nAutomatisk nedlasting for dette elementet er deaktivert + Nedlasting fullført med feilmeldinger + Nedlastingsrapport + Misformet URL + IO feil + Forespørselfeil + Tilgangsfeil for database + Behandler nedlastninger + Laster ned data til podcast + %1$d nedlastninger lyktes, %2$d mislyktes + Ukjent tittel + Strøm + Mediafil + Bilde + En feil oppsto under nedlastningen av filen:\u0020 + Autentisering påkreves + Ressursen du forespør krever brukernavn og passord + Bekreft nedlasting over mobildata + Nedlasting over mobildata er deaktivert i innstillingene.\n\nDu kan velge å legge episoden til i køen eller tillate midlertidig nedlasting over mobildata.\n\nValget ditt vil gjelde i 10 minutter. + Nedlasting over mobildata er deaktivert i innstillingene.\n\nVil du tillate nedlasting over mobildata midlertidig?\n\nValget ditt vil gjelde i 10 minutter. + Legg til i kø + Tillat midlertidig + + Error! + Ingen media spillende for øyeblikket. + Forbereder + Klar + Oppsøker + Serveren døde + Ukjent feil + Ingen media spillende for øyeblikket. + 00:00:00 + Bufrer + Spiller podcast + AntennaPod - Ukjent medienøkkel: %1$d + + Lås køen + Lås opp køen + Slett køen + Angre + Objekt er fjernet + Gå til toppen + Gå til bunnen + Sortér + Alfabetisk + På dato + På varighet + Økende + Synkende + Vennligst bekreft at du ønsker å slette ALLE elementer i køen + + Flattr innlogging + Trykk knappen nedenfor for å starte autentiseringsprosessen. Du vil videresendes til flattr sin innloggsinsskjerm i din nettleser og spurt om å gi AntennaPod tillatelse til å flattr\'e ting. Etter at du har gitt tillatelse blir du returnert hit automatisk. + Autentiser + Returner hjem + Autentisering fullført! Nå kan du flattr tingene i denne appen. + Flattr-token ikke funnet + Det virker som at Flattr-kontoen din ikke er sammenkoblet med AntennaPod. Trykk her for å autentisere. + Det virker ikke som din flattr konto er koblet til AntennaPod. Du kan enten koble kontoen din til AntennaPod for å flattr\'e ting i appen eller du kan besøke nettsiden til tingen for å flattr\'e det der. + Autentiser + Handling forbudt + AntennaPod har ikke tilgang til denne handlingen. Grunnen kan være at tilgangstokenet til kontoen din er blitt inndratt. Du kan enten re-autentisere eller besøke tjenestens nettsted. + Tilgang opphevet + Du har fjernet AntennaPods tilgang til kontoen din. For å fullføre prossessen må du fjerne denne appen fra listen over tillatte apper på flattr-nettsiden. + + Flattr\'erte en ting! + Flattret %d ting! + Flattret: %s. + Klarte ikke flattre %d ting! + Ikke flattret: %s. + Tingen vil bli flattret senere + Flattrer %s + AntennaPod flattrer + AntennaPod har flattret + AntennaPods flattring feilet + Henter flattrede ting + + Last ned programtillegg + Programtillegg er ikke installert + Avspillingshastigheter + Skru på Sonic + + Det er ingen objekter på denne listen. + Du abonnerer ikke på noen strømmer enda. + + Annet + Om + Queue + Tjenester + Flattr + Episodeopprydding + Sett playback på pause når hodetelefoner eller bluetooth er frakoblet + Gjenoppta avspilling når hodetelefoner gjeninnkoples + Fortsett avspilling når bluetooth er tilkoblet igjen + Forover-knapp hopper + Ved pressing av hardware forover-knapp hopp til neste episode istedenfor forover-spoling + Hopp til neste element i køen når avspillingen er ferdig + Slett episode når avspillingen er ferdig + Automatisk sletting + Marker episoder som avspilt selv om det er X antall sekunder igjen av avspillingen + Smart markering av avspilt + Behold episoder når de hoppes over + Behold episoder som er hoppet over + Avspilling + Nettverk + Oppdateringsintervall eler tidspunkt + Spesifiser en intervall eller et spesifikt tidspunkt når strømmer skal oppdateres automatisk + Du kan sette en intervall som «hver andre time», et spesifikt tidspunkt som «07:00» eller skru av automatiske oppdateringer helt.\n\nMerk: Oppdateringstider er ikke eksakte; du kan oppleve små forsinkelser. + Skru av + Sett intervall + Angi klokkeslett + Last ned mediafiler eksklusivt med WiFi + Kontinuerlig avspilling + WiFi media nedlastning + Frakobling av hodetelefoner + Gjeninnkopling av hodetelefoner + Blutetooth tilkoblet igjen + Mobiloppdateringer + Tillat oppdateringer over kobling via mobildata + Oppdaterer + Flattr innstillinger + Flattr logg in + Logg på din flattr konto for å flattr ting direkte fra appen. + Flattr denne appen + Støtt utviklingen av AntennaPod ved å flattr\'e det. Tusen takk! + Opphev tilgang + Opphev tilgangstillatelsen til din flattr konto for denne appen. + Automatisk Flattr + Konfigurer automatisk flattring + Brukergrensesnitt + Velg tema + Skreddersy navigasjonsskuff + Velg utseendet til navigasjonsskuffen. + Velg elementer i navigasjonsskuffen + Endre hvilke elementer som vises i navigeringsfanen. + Velg rekkefølge på abbonement + Endre rekkefølgen på abbonementene dine + Velg abbonementsteller + Endre informasjonen vist av abonnementstelleren + Endre utseendet til AntennaPod + Automatisk nedlasting + Konfigurer automatisk nedlasting av episoder. + Skru på Wi-Fi-filter + Tillat automatisk nedlasting kun for valgte Wi-Fi-nettverk. + Last ned når enheten ikke lader + Tillat automatisk nedlasting når enheten ikke står til lading + Parallelle nedlastinger + Mellomlager for episoder + Lyst + Mørkt + Ulimitert + Timer + Time + Manuelt + Logg inn + Logg inn med din gpodder.net konto for å synkronisere dine abonnementer. + Logg ut + Utloggelse lyktes + Endre innloggingsinformasjon + Endre innlogginsinformasjonen til din gpodder.net konto + Avspillingshastigheter + Egendefiner hastighetene tilgjengelig for variabel avspillingshastighet + Spoling fremover + Spoling bakover + Sett vertsnavn + Bruk standard vert + Utvid varsel + Utvider alltid varselet for å inkludere avspillingsknapper. + Vedvarende avspillingskontroller + Behold varsel- og låseskjermkontroller når avspilling er satt på pause. + Angi som bakgrunn på låseskjermen + Angir låseskjermbakgrunnsbildet til å være den nåværende episodens bilde. Som en sideeffekt vil dette også vise bildet i tredjepartsapper. + Vis nedlastingsrapport + Generer en rapport som viser detaljer dersom nedlastinger feiler. + Android-versjoner tidligere enn 4.1 støtter ikke utvidede varsler. + Legg til nye episoder i begynnelsen av køen. + Legg til foran i køen + Deaktivert + Størrelse for bildemellomlager + Størrelsen på mellomlageret for bilder. + Kræsj-rapport + Send den siste kræsj-rapporten via e-post + Send e-post + Eksperimentell + Sonic medieavspiller + + Aktiver automatisk flattring + Flattre episode så snart %d prosent er avspilt + Flattre episode når avspillingen starter + Flattre episode når avspillingen tar slutt + + Søk etter strømmer eller episoder + Funnet i shownotater + Funnet i kapitler + Ingen resultater ble funnet + Søk + Funnet i tittel + + OPML-filer lar deg flytte podcastene dine fra en podcatcher til en annen. + Valg %1$d + Velg en spesifikk filbane fra det lokale filsystemet. + Bruk en ektern applikasjon som Dropbox, Google Drive eller favoritt-filbehandleren din for å åpne en OPML-fil. + Mange applikasjoner som Gmail, Dropbox, Google Drive og de fleste filbehandlere kan åpne OPML-filer med AntennaPod. + Start importering + OPML-import + ERROR! + Leser OPML-fil + En feil oppsto under lesingen av opml dokumentet: + Importkatalogen er tom. + Velg alle + Opphev alle markeringene + Fra lokalt filsystem + Bruk ekstern applikasjon + OPML-eksportering + Eksporteringserror + OPML-import vellykket. + .opml-filen ble skrevet til:\u0020 + + Sett opp sovetimer + Deaktiver sovetimer + Legg til tid + Sovetimer + Tid igjen:\u0020 + Ugyldig innspill, tid må være et heltall + Når nedtellingen er i ferd med å utløpe: + Rist for å tilbakestille nedtellingen + Vibrer + sekunder + minutter + timer + + 1 sekund + %d sekunder + + + 1 minutt + %d minutter + + + 1 time + %d timer + + + KATEGORIER + TOPP-PODCASTER + FORSLAG + Søk på gpodder.net + Logg inn + Velkommen til gpodder.net innlogginsprosess. Først begynner vi med å skrive inn innlogginsinformasjon. + Logg inn + Dersom du ikke har en konto enda kan du opprette en her:\nhttps://gpodder.net/register/ + Brukernavn + Passord + Enhetsvalg + Lag en ny enhet til å bruke for din gpodder.net konto eller velg en som allerede eksisterer. + EnhetsID:\u0020 + Tekst + Lag en ny enhet + Velg eksisterende enhet: + Device ID kan ikke være tom + EnhetsID er allerede i bruk + Velg + Innlogging lyktes! + Gratulerer! Din gpodder.net konto er nå linket opp med din enhet. AntennaPod vil nå automatisk synkronisere abonnementer på din enhet med din gpodder.net konto. + Start synkronisering nå. + Gå til hovedskjermen + gpodder.net-autentiseringsfeil + Feil brukernavn eller passord. + gpodder.net synkroniseringserror + En feil oppsto under synkronisering av:\u0020 + + Valgt mappe + Lag mappe + Velg datamappe + Vennligst velg basisen for datamappen din. AntennaPod vil lage de nødvendige submappene dine. + Lag en ny mappe med navn \"%1$s\"? + Lagde en ny mappe + Kan ikke skrive til denne mappen + Mappe eksisterer allerede + Kunne ikke lage mappe + %1$s eksisterer ikke + %1$s kan ikke leses + %1$s kan ikke skrives til + Mappen er ikke tom + Mappen du har valgt er ikke tom. Nedlastet media og andre filer vil bli plassert direkte i denne mappen? Vil du fortsette? + Velg standardmappe + Sett pause på playback istedenfor å skru ned volumet når en annen app har lyst å spille av lyder + Pause for avbrytelser + Gjenoppta avspilling etter at telefonsamtaler avsluttes + Gjenoppta etter samtale + AntennaPod må startes om for at denne endringen skal lagres. + + Abonner + Abonnert + + Vis kapitler + Vis notater + Vis bilde + Spol tilbake + Spol fremover + Lyd + Video + Naviger oppover + Flere handlinger + Episode spilles nå + Episode lastes ned nå + Episode har blitt lastet ned + Objekt er nytt + Episoden er i queue + Antall nye episoder + Antall episoder du har begynt å høre på + Dra for å endre posisjonen til dette objektet + Last inn neste side + + Autentisering + Endre brukernavnet og passordet for denne podcasten og dens episoder. + + Oppgraderer databasen + + Importerer abbonementer fra enkeltstående applikasjoner ... + Søk på iTunes + Alle + Valgte alle episoder + Ingen + Fjernet valg av alle episoder + Avspilt + Valgte avspilte episoder + Uavspilt + Valgte uavspilte episoder + Nedlastede + Valgte nedlastede episoder + Ikke nedlastet + Valgte ikke-nedlastede episoder + Tittel (A \u2192 Z) + Tittel (Z \u2192 A) + Dato (Ny \u2192 Gammel) + Dato (Gammel \u2192 Ny) + Lengde (Kort \u2192 Lang) + Lengde (Lang \u2192 Kort) + + Liker du AntennaPod? + Vi ville satt pris på om du tok deg tid til å vurdere AntennaPod. + La meg være i fred + Minn meg på dette senere + Naturligvis, kom igjen! + + diff --git a/core/src/main/res/values-no/strings.xml b/core/src/main/res/values-no/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-no/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml new file mode 100644 index 000000000..784b69c5a --- /dev/null +++ b/core/src/main/res/values-pl/strings.xml @@ -0,0 +1,99 @@ + + + + AntennaPod + PODKASTY + Ustawienia + Dziennik + + Ostatnio opublikowane + + Otwórz menu + Zamknij menu + + Kopiuj URL + Udostępnij URL + + + Potwierdź + Anuluj + Autor + Język + URL + Ustawienia + Obrazek + Błąd + Odśwież + Rozdział + Opis + \u0020 odcinków + Długość:\u0020 + Rozmiar:\u0020 + Zapis nazwę użytkownika i hasło + Zamknij + Ponów + + www.example.com/feed + Przeglądaj gpodder.net + + Zaznacz wszystkie jako przesłuchane + Pokaż informacje + Pobrany + + Pobierz + Odtwórz + Zatrzymaj + Usuń + Zaznacz jako przesłuchany + Zaznacz jako nieprzesłuchany + Dodaj do kolejki + Dodano do kolejki + Usuń z kolejki + Odwiedź stronę + Pobierz wszystko + Pomiń odcinek + + Nieznany błąd + + Błąd! + Serwer umarł + Nieznany błąd + 00:00:00 + Buforowanie + + Sortuj + Data + Czas trwania + Rosnąco + Malejąco + + + + + + Kolejka + Usługi + Pobieraj pliki tylko przez WiFi + Odświeżanie + Interfejs Użytkownika + Wylogowano pomyślnie + + + + + + + Wybrany folder + Utworzyć nowy folder z nazwą \"%1$s\"? + Folder już istnieje + Nie można utworzyć folderu + Folder nie jest pusty + Wybierz domyślny folder + + + + + + + + diff --git a/core/src/main/res/values-vi-rVN/strings.xml b/core/src/main/res/values-vi-rVN/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-vi-rVN/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-vi/strings.xml b/core/src/main/res/values-vi/strings.xml new file mode 100644 index 000000000..f16823f84 --- /dev/null +++ b/core/src/main/res/values-vi/strings.xml @@ -0,0 +1,60 @@ + + + + Các feed + Tạo mới + Thiết lập + Tải về + + + + + + Xác nhận + Hủy bỏ + Tác giả + Ngôn ngữ + Lỗi + Cập nhật lại + Hiện không có thiết bị lưu trữ gắn ngoài nào. Hãy chắc rằng bạn đã kết nối máy của mình với thiết bị lưu trữ gắn ngoài để ứng dụng có thể được hoạt động trơn tru. + Chương + Hiển thị ghi chú + \u0020tập + Độ dài:\u0020 + Kích thước:\u0020 + Đang xử lý + + Đường dẫn liên kết feed + + Hiển thị thông ti + Xin vui lòng xác nhận rằng bạn muốn xóa feed này và toàn bộ các phần khác của feed này mà bạn đã tải về. + + Tải về + Phát + Phân luồng + Loại bỏ + Thêm vào hàng đợi + Loại bỏ khỏi hàng đợi + Truy cập website + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From ff32ebb9dbf41f5a604159e93b4c825e20a1262e Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 25 Mar 2016 00:46:13 +0100 Subject: Typo --- core/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index eaf6d09fb..1ce5301ca 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -618,7 +618,7 @@ Test successful Test failed Host must not be empty - Host not valid UP or domain + Host not valid IP or domain Port not valid -- cgit v1.2.3 From 04026ca48c2b557aff1e373bad06a836072721b5 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 25 Mar 2016 00:48:20 +0100 Subject: Typos --- core/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 1ce5301ca..6e2848c20 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -401,7 +401,7 @@ Proxy Set a network proxy Known issues - No web browser found." + No web browser found. Enable automatic flattring @@ -618,7 +618,7 @@ Test successful Test failed Host must not be empty - Host not valid IP or domain + Host not valid IP address or domain Port not valid -- cgit v1.2.3 From 0564988357c3b6e31915a37276250c405c95482e Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 24 Mar 2016 16:42:57 +0100 Subject: Refactor --- .../antennapod/core/service/playback/PlaybackService.java | 3 +-- .../core/service/playback/PlaybackServiceMediaPlayer.java | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) (limited to 'core/src') 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 9ca05d1f7..8744f0349 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 @@ -512,8 +512,7 @@ public class PlaybackService extends Service { @Override public void playbackSpeedChanged(float s) { - sendNotificationBroadcast( - NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); + sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); } @Override 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 3ab26eb22..3ecd93274 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 @@ -25,6 +25,8 @@ import android.view.WindowManager; import com.bumptech.glide.Glide; +import org.antennapod.audio.MediaPlayer; + import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingDeque; @@ -1050,7 +1052,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return mp; } - private final org.antennapod.audio.MediaPlayer.OnCompletionListener audioCompletionListener = + private final MediaPlayer.OnCompletionListener audioCompletionListener = mp -> genericOnCompletion(); private final android.media.MediaPlayer.OnCompletionListener videoCompletionListener = @@ -1060,7 +1062,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre endPlayback(false); } - private final org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener = + private final MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener = (mp, percent) -> genericOnBufferingUpdate(percent); private final android.media.MediaPlayer.OnBufferingUpdateListener videoBufferingUpdateListener = @@ -1070,7 +1072,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre callback.onBufferingUpdate(percent); } - private final org.antennapod.audio.MediaPlayer.OnInfoListener audioInfoListener = + private final MediaPlayer.OnInfoListener audioInfoListener = (mp, what, extra) -> genericInfoListener(what); private final android.media.MediaPlayer.OnInfoListener videoInfoListener = @@ -1080,7 +1082,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return callback.onMediaPlayerInfo(what); } - private final org.antennapod.audio.MediaPlayer.OnErrorListener audioErrorListener = + private final MediaPlayer.OnErrorListener audioErrorListener = (mp, what, extra) -> { if(mp.canFallback()) { mp.fallback(); @@ -1096,7 +1098,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return callback.onMediaPlayerError(inObj, what, extra); } - private final org.antennapod.audio.MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener = + private final MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener = mp -> genericSeekCompleteListener(); private final android.media.MediaPlayer.OnSeekCompleteListener videoSeekCompleteListener = -- cgit v1.2.3 From 96634c42b3f0d9a16ddf5b43a2cb1eb8b8ee0570 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 24 Mar 2016 16:43:41 +0100 Subject: React to enabling sonic mediaplayer --- .../antennapod/core/service/playback/PlaybackService.java | 9 +++++++++ .../core/service/playback/PlaybackServiceMediaPlayer.java | 12 ++++++++++++ .../de/danoeh/antennapod/core/util/playback/AudioPlayer.java | 12 ++++++++++++ .../antennapod/core/util/playback/PlaybackController.java | 4 ++++ 4 files changed, 37 insertions(+) (limited to 'core/src') 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 8744f0349..1ca06de52 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 @@ -141,6 +141,11 @@ public class PlaybackService extends Service { */ public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE = 8; + /** + * Playback speed has changed + */ + public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED = 9; + /** * Returned by getPositionSafe() or getDurationSafe() if the playbackService * is in an invalid state. @@ -515,6 +520,10 @@ public class PlaybackService extends Service { sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); } + public void playbackSpeedAvailableChanged() { + sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED, 0); + } + @Override public void onBufferingUpdate(int percent) { sendNotificationBroadcast(NOTIFICATION_TYPE_BUFFER_UPDATE, percent); 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 3ecd93274..0c7bb5cb9 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 @@ -1018,6 +1018,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre void playbackSpeedChanged(float s); + void playbackSpeedAvailableChanged(); + void onBufferingUpdate(int percent); boolean onMediaPlayerInfo(int code); @@ -1038,6 +1040,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre ((AudioPlayer) mp) .setOnBufferingUpdateListener(audioBufferingUpdateListener); ((AudioPlayer) mp).setOnInfoListener(audioInfoListener); + ((AudioPlayer) mp).setOnSpeedAdjustmentAvailableChangedListener(audioSpeedAvailableChangedListener); } else { ((VideoPlayer) mp) .setOnCompletionListener(videoCompletionListener); @@ -1082,6 +1085,15 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return callback.onMediaPlayerInfo(what); } + private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener + audioSpeedAvailableChangedListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() { + @Override + public void onSpeedAdjustmentAvailableChanged(MediaPlayer arg0, boolean speedAdjustmentAvailable) { + callback.playbackSpeedAvailableChanged(); + } + }; + + private final MediaPlayer.OnErrorListener audioErrorListener = (mp, what, extra) -> { if(mp.canFallback()) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java index f0850e6df..846733882 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java @@ -1,8 +1,11 @@ package de.danoeh.antennapod.core.util.playback; import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.util.Log; import android.view.SurfaceHolder; + import org.antennapod.audio.MediaPlayer; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -12,8 +15,17 @@ public class AudioPlayer extends MediaPlayer implements IPlayer { public AudioPlayer(Context context) { super(context); + PreferenceManager.getDefaultSharedPreferences(context) + .registerOnSharedPreferenceChangeListener(sonicListener); } + private final SharedPreferences.OnSharedPreferenceChangeListener sonicListener = + (sharedPreferences, key) -> { + if (key.equals(UserPreferences.PREF_SONIC)) { + checkMpi(); + } + }; + @Override public void setScreenOnWhilePlaying(boolean screenOn) { Log.e(TAG, "Setting screen on while playing not supported in Audio Player"); 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 0ad286093..17b1bd72f 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 @@ -336,6 +336,8 @@ public abstract class PlaybackController { case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: onPlaybackSpeedChange(); break; + case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED: + onPlaybackSpeedAvailableChanged(); } } @@ -362,6 +364,8 @@ public abstract class PlaybackController { public void onPlaybackSpeedChange() {} + public void onPlaybackSpeedAvailableChanged() {} + public void onShutdownNotification() {} /** -- cgit v1.2.3 From 383a833c30fa13f18a5e58319f2045d3c0f08ea8 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Fri, 25 Mar 2016 13:20:07 +0100 Subject: Refactor --- .../danoeh/antennapod/core/service/playback/PlaybackService.java | 8 ++++---- .../core/service/playback/PlaybackServiceMediaPlayer.java | 8 ++++---- .../danoeh/antennapod/core/util/playback/PlaybackController.java | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'core/src') 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 1ca06de52..729ea9e7a 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 @@ -142,9 +142,9 @@ public class PlaybackService extends Service { public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE = 8; /** - * Playback speed has changed + * Ability to set the playback speed has changed */ - public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED = 9; + public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9; /** * Returned by getPositionSafe() or getDurationSafe() if the playbackService @@ -520,8 +520,8 @@ public class PlaybackService extends Service { sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); } - public void playbackSpeedAvailableChanged() { - sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED, 0); + public void setSpeedAbilityChanged() { + sendNotificationBroadcast(NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED, 0); } @Override 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 0c7bb5cb9..aa51840a7 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 @@ -1018,7 +1018,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre void playbackSpeedChanged(float s); - void playbackSpeedAvailableChanged(); + void setSpeedAbilityChanged(); void onBufferingUpdate(int percent); @@ -1040,7 +1040,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre ((AudioPlayer) mp) .setOnBufferingUpdateListener(audioBufferingUpdateListener); ((AudioPlayer) mp).setOnInfoListener(audioInfoListener); - ((AudioPlayer) mp).setOnSpeedAdjustmentAvailableChangedListener(audioSpeedAvailableChangedListener); + ((AudioPlayer) mp).setOnSpeedAdjustmentAvailableChangedListener(audioSetSpeedAbilityListener); } else { ((VideoPlayer) mp) .setOnCompletionListener(videoCompletionListener); @@ -1086,10 +1086,10 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener - audioSpeedAvailableChangedListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() { + audioSetSpeedAbilityListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() { @Override public void onSpeedAdjustmentAvailableChanged(MediaPlayer arg0, boolean speedAdjustmentAvailable) { - callback.playbackSpeedAvailableChanged(); + callback.setSpeedAbilityChanged(); } }; 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 17b1bd72f..1409ffe09 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 @@ -336,8 +336,8 @@ public abstract class PlaybackController { case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: onPlaybackSpeedChange(); break; - case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE_AVAILABLE_CHANGED: - onPlaybackSpeedAvailableChanged(); + case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED: + onSetSpeedAbilityChanged(); } } @@ -364,7 +364,7 @@ public abstract class PlaybackController { public void onPlaybackSpeedChange() {} - public void onPlaybackSpeedAvailableChanged() {} + public void onSetSpeedAbilityChanged() {} public void onShutdownNotification() {} -- cgit v1.2.3 From 5afff3e9d16d883a74b4dba8e38a8d6bc862b16c Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 25 Mar 2016 08:35:11 -0400 Subject: more categories in preferences --- core/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6e2848c20..23e04440a 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -289,6 +289,8 @@ + Storage + Project Other About Queue -- cgit v1.2.3 From 7f406980507c6a5b8c0fa6ac7dba8e640316bd45 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 25 Mar 2016 08:41:05 -0400 Subject: add faq --- core/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 23e04440a..d7a9e3877 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -402,6 +402,7 @@ Current value: %1$s Proxy Set a network proxy + FAQ Known issues No web browser found. -- cgit v1.2.3 From 1d8d04fecb8f5104e161c551d970f30029df7a23 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 25 Mar 2016 09:44:49 -0400 Subject: check if caption is empty too --- core/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) (limited to 'core/src') diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6e2848c20..d268de3da 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -485,6 +485,7 @@ Choose existing device: Device ID must not be empty Device ID already in use + Caption must not be empty Choose Login successful! -- cgit v1.2.3 From 4cd58a9b37899e0c886a930f268b701d29a9a989 Mon Sep 17 00:00:00 2001 From: Tom Hennen Date: Fri, 25 Mar 2016 10:50:41 -0400 Subject: updated and fixed PR AntennaPod/AntennPod#1624 --- .../antennapod/core/ApplicationCallbacks.java | 4 +- .../de/danoeh/antennapod/core/ClientConfig.java | 22 + .../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 +- .../de/danoeh/antennapod/core/UpdateManager.java | 97 ++++ .../antennapod/core/asynctask/FeedRemover.java | 4 +- .../core/asynctask/FlattrClickWorker.java | 30 +- .../core/asynctask/FlattrStatusFetcher.java | 12 +- .../antennapod/core/asynctask/ImageResource.java | 6 +- .../antennapod/core/backup/OpmlBackupAgent.java | 10 +- .../antennapod/core/dialog/ConfirmationDialog.java | 24 +- .../dialog/DownloadRequestErrorDialogCreator.java | 9 +- .../antennapod/core/feed/EventDistributor.java | 10 +- .../java/de/danoeh/antennapod/core/feed/Feed.java | 46 +- .../danoeh/antennapod/core/feed/FeedComponent.java | 3 +- .../de/danoeh/antennapod/core/feed/FeedFile.java | 4 +- .../de/danoeh/antennapod/core/feed/FeedItem.java | 23 +- .../de/danoeh/antennapod/core/feed/FeedMedia.java | 57 ++- .../antennapod/core/feed/FeedPreferences.java | 5 +- .../antennapod/core/glide/ApOkHttpUrlLoader.java | 2 - .../antennapod/core/gpoddernet/GpodnetService.java | 25 +- .../core/gpoddernet/model/GpodnetDevice.java | 23 +- .../gpoddernet/model/GpodnetEpisodeAction.java | 11 +- .../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 | 100 ++-- .../core/receiver/AlarmUpdateReceiver.java | 5 +- .../core/receiver/FeedUpdateReceiver.java | 2 + .../core/receiver/MediaButtonReceiver.java | 9 +- .../core/service/GpodnetSyncService.java | 4 +- .../service/download/AntennapodHttpClient.java | 32 +- .../core/service/download/DownloadRequest.java | 30 +- .../core/service/download/DownloadService.java | 237 ++++------ .../core/service/download/DownloaderCallback.java | 2 +- .../core/service/download/HttpDownloader.java | 51 ++- .../core/service/download/ProxyConfig.java | 32 ++ .../core/service/playback/PlaybackService.java | 14 +- .../playback/PlaybackServiceMediaPlayer.java | 441 +++++++++--------- .../playback/PlaybackServiceTaskManager.java | 55 +-- .../core/storage/APCleanupAlgorithm.java | 59 ++- .../core/storage/APDownloadAlgorithm.java | 115 +++-- .../core/storage/APNullCleanupAlgorithm.java | 5 + .../core/storage/APQueueCleanupAlgorithm.java | 38 +- .../core/storage/AutomaticDownloadAlgorithm.java | 2 +- .../danoeh/antennapod/core/storage/DBReader.java | 132 +++++- .../de/danoeh/antennapod/core/storage/DBTasks.java | 81 ++-- .../danoeh/antennapod/core/storage/DBWriter.java | 9 +- .../antennapod/core/storage/DownloadRequester.java | 22 +- .../core/storage/EpisodeCleanupAlgorithm.java | 5 + .../antennapod/core/storage/FeedSearcher.java | 15 +- .../antennapod/core/storage/PodDBAdapter.java | 374 +++++++++------ .../core/syndication/handler/HandlerState.java | 6 +- .../core/syndication/handler/TypeGetter.java | 41 +- .../core/syndication/namespace/NSContent.java | 6 +- .../core/syndication/namespace/NSDublinCore.java | 20 +- .../core/syndication/namespace/NSITunes.java | 61 ++- .../core/syndication/namespace/NSMedia.java | 59 +-- .../core/syndication/namespace/NSRSS20.java | 88 ++-- .../syndication/namespace/NSSimpleChapters.java | 30 +- .../core/syndication/namespace/atom/NSAtom.java | 103 ++--- .../core/syndication/util/SyndTypeUtils.java | 3 +- .../danoeh/antennapod/core/util/ChapterUtils.java | 13 +- .../de/danoeh/antennapod/core/util/Converter.java | 35 +- .../de/danoeh/antennapod/core/util/DateUtils.java | 19 +- .../danoeh/antennapod/core/util/DownloadError.java | 5 +- .../danoeh/antennapod/core/util/EpisodeFilter.java | 2 +- .../de/danoeh/antennapod/core/util/IntList.java | 4 +- .../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/flattr/FlattrServiceCreator.java | 13 +- .../core/util/gui/FeedItemUndoToken.java | 55 --- .../core/util/gui/MoreContentListFooterUtil.java | 13 +- .../core/util/id3reader/ChapterReader.java | 99 ++-- .../antennapod/core/util/playback/AudioPlayer.java | 12 + .../core/util/playback/ExternalMedia.java | 14 +- .../antennapod/core/util/playback/Playable.java | 54 +-- .../core/util/playback/PlaybackController.java | 328 +++++++------ .../antennapod/core/util/playback/Timeline.java | 64 ++- .../VorbisCommentChapterReader.java | 4 +- .../vorbiscommentreader/VorbisCommentReader.java | 6 +- .../drawable-hdpi-v11/ic_stat_antenna_default.png | Bin 678 -> 541 bytes .../drawable-hdpi-v11/ic_stat_authentication.png | Bin 467 -> 371 bytes .../main/res/drawable-hdpi/ic_add_grey600_24dp.png | Bin 222 -> 125 bytes .../main/res/drawable-hdpi/ic_add_white_24dp.png | Bin 223 -> 124 bytes .../res/drawable-hdpi/ic_av_fast_forward_80dp.png | Bin 1228 -> 429 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 3309 -> 1100 bytes .../ic_av_play_circle_outline_80dp.png | Bin 3395 -> 1232 bytes .../main/res/drawable-hdpi/ic_av_rewind_80dp.png | Bin 1277 -> 408 bytes .../res/drawable-hdpi/ic_cancel_grey600_24dp.png | Bin 522 -> 415 bytes .../res/drawable-hdpi/ic_cancel_white_24dp.png | Bin 510 -> 394 bytes .../drawable-hdpi/ic_check_box_grey600_24dp.png | Bin 584 -> 278 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 397 -> 180 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 340 -> 170 bytes .../res/drawable-hdpi/ic_check_box_white_24dp.png | Bin 505 -> 260 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 0 -> 167 bytes .../ic_create_new_folder_white_24dp.png | Bin 0 -> 164 bytes .../res/drawable-hdpi/ic_delete_grey600_24dp.png | Bin 248 -> 161 bytes .../res/drawable-hdpi/ic_delete_white_24dp.png | Bin 246 -> 158 bytes .../drawable-hdpi/ic_description_grey600_36dp.png | Bin 425 -> 0 bytes .../drawable-hdpi/ic_description_white_36dp.png | Bin 424 -> 0 bytes .../res/drawable-hdpi/ic_done_grey600_24dp.png | Bin 326 -> 175 bytes .../main/res/drawable-hdpi/ic_done_white_24dp.png | Bin 309 -> 169 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 389 -> 289 bytes .../ic_drag_vertical_white_48dp.9.png | Bin 361 -> 265 bytes .../drawable-hdpi/ic_expand_more_grey600_36dp.png | Bin 348 -> 195 bytes .../drawable-hdpi/ic_expand_more_white_36dp.png | Bin 324 -> 189 bytes .../drawable-hdpi/ic_fast_forward_grey600_24dp.png | Bin 366 -> 256 bytes .../drawable-hdpi/ic_fast_forward_grey600_36dp.png | Bin 460 -> 324 bytes .../drawable-hdpi/ic_fast_forward_white_24dp.png | Bin 360 -> 253 bytes .../drawable-hdpi/ic_fast_forward_white_36dp.png | Bin 451 -> 315 bytes .../drawable-hdpi/ic_fast_rewind_grey600_24dp.png | Bin 395 -> 267 bytes .../drawable-hdpi/ic_fast_rewind_grey600_36dp.png | Bin 480 -> 331 bytes .../drawable-hdpi/ic_fast_rewind_white_24dp.png | Bin 376 -> 261 bytes .../drawable-hdpi/ic_fast_rewind_white_36dp.png | Bin 461 -> 321 bytes .../res/drawable-hdpi/ic_feed_grey600_24dp.png | Bin 1159 -> 511 bytes .../main/res/drawable-hdpi/ic_feed_white_24dp.png | Bin 727 -> 458 bytes .../ic_file_download_grey600_24dp.png | Bin 276 -> 154 bytes .../drawable-hdpi/ic_file_download_white_24dp.png | Bin 277 -> 150 bytes .../res/drawable-hdpi/ic_filter_grey600_24dp.png | Bin 135 -> 111 bytes .../res/drawable-hdpi/ic_filter_white_24dp.png | Bin 131 -> 110 bytes .../res/drawable-hdpi/ic_hearing_grey600_18dp.png | Bin 583 -> 478 bytes .../res/drawable-hdpi/ic_hearing_white_18dp.png | Bin 602 -> 449 bytes .../res/drawable-hdpi/ic_history_grey600_24dp.png | Bin 636 -> 509 bytes .../res/drawable-hdpi/ic_history_white_24dp.png | Bin 638 -> 511 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 405 -> 179 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 348 -> 171 bytes .../res/drawable-hdpi/ic_info_grey600_24dp.png | Bin 448 -> 342 bytes .../main/res/drawable-hdpi/ic_info_white_24dp.png | Bin 433 -> 325 bytes core/src/main/res/drawable-hdpi/ic_launcher.png | Bin 3955 -> 3887 bytes .../res/drawable-hdpi/ic_list_grey600_24dp.png | Bin 207 -> 115 bytes .../main/res/drawable-hdpi/ic_list_white_24dp.png | Bin 207 -> 114 bytes .../drawable-hdpi/ic_lock_closed_grey600_24dp.png | Bin 366 -> 315 bytes .../drawable-hdpi/ic_lock_closed_white_24dp.png | Bin 358 -> 303 bytes .../drawable-hdpi/ic_lock_open_grey600_24dp.png | Bin 362 -> 314 bytes .../res/drawable-hdpi/ic_lock_open_white_24dp.png | Bin 356 -> 299 bytes .../drawable-hdpi/ic_more_vert_grey600_24dp.png | Bin 221 -> 0 bytes .../res/drawable-hdpi/ic_more_vert_white_24dp.png | Bin 219 -> 0 bytes core/src/main/res/drawable-hdpi/ic_new.png | Bin 891 -> 0 bytes core/src/main/res/drawable-hdpi/ic_new_dark.png | Bin 716 -> 0 bytes .../drawable-hdpi/ic_new_releases_grey600_24dp.png | Bin 501 -> 399 bytes .../drawable-hdpi/ic_new_releases_white_24dp.png | Bin 491 -> 381 bytes .../res/drawable-hdpi/ic_pause_grey600_24dp.png | Bin 188 -> 103 bytes .../res/drawable-hdpi/ic_pause_grey600_36dp.png | Bin 235 -> 126 bytes .../main/res/drawable-hdpi/ic_pause_white_24dp.png | Bin 188 -> 103 bytes .../main/res/drawable-hdpi/ic_pause_white_36dp.png | Bin 234 -> 124 bytes .../drawable-hdpi/ic_play_arrow_grey600_24dp.png | Bin 301 -> 195 bytes .../drawable-hdpi/ic_play_arrow_grey600_36dp.png | Bin 355 -> 235 bytes .../res/drawable-hdpi/ic_play_arrow_white_24dp.png | Bin 282 -> 194 bytes .../res/drawable-hdpi/ic_play_arrow_white_36dp.png | Bin 348 -> 232 bytes .../res/drawable-hdpi/ic_refresh_grey600_24dp.png | Bin 508 -> 407 bytes .../res/drawable-hdpi/ic_refresh_white_24dp.png | Bin 531 -> 367 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 470 -> 380 bytes .../drawable-hdpi/ic_remove_red_eye_white_18dp.png | Bin 468 -> 358 bytes .../drawable-hdpi/ic_sd_storage_grey600_36dp.png | Bin 0 -> 259 bytes .../res/drawable-hdpi/ic_sd_storage_white_36dp.png | Bin 0 -> 247 bytes .../res/drawable-hdpi/ic_search_grey600_24dp.png | Bin 522 -> 412 bytes .../res/drawable-hdpi/ic_search_white_24dp.png | Bin 504 -> 386 bytes .../res/drawable-hdpi/ic_settings_grey600_24dp.png | Bin 572 -> 468 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 713 -> 569 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 703 -> 553 bytes .../res/drawable-hdpi/ic_settings_white_24dp.png | Bin 561 -> 438 bytes .../res/drawable-hdpi/ic_share_grey600_24dp.png | Bin 513 -> 413 bytes .../main/res/drawable-hdpi/ic_share_white_24dp.png | Bin 506 -> 382 bytes .../res/drawable-hdpi/ic_skip_grey600_36dp.png | Bin 302 -> 256 bytes .../main/res/drawable-hdpi/ic_skip_white_36dp.png | Bin 304 -> 251 bytes .../res/drawable-hdpi/ic_sleep_grey600_24dp.png | Bin 421 -> 180 bytes .../drawable-hdpi/ic_sleep_off_grey600_24dp.png | Bin 659 -> 290 bytes .../res/drawable-hdpi/ic_sleep_off_white_24dp.png | Bin 431 -> 264 bytes .../main/res/drawable-hdpi/ic_sleep_white_24dp.png | Bin 361 -> 179 bytes .../res/drawable-hdpi/ic_sort_grey600_24dp.png | Bin 264 -> 118 bytes .../main/res/drawable-hdpi/ic_sort_white_24dp.png | Bin 238 -> 114 bytes .../drawable-hdpi/ic_star_border_grey600_24dp.png | Bin 637 -> 530 bytes .../drawable-hdpi/ic_star_border_white_24dp.png | Bin 637 -> 488 bytes .../res/drawable-hdpi/ic_star_grey600_24dp.png | Bin 460 -> 389 bytes .../main/res/drawable-hdpi/ic_star_white_24dp.png | Bin 454 -> 369 bytes .../res/drawable-hdpi/ic_stat_antenna_default.png | Bin 649 -> 473 bytes .../res/drawable-hdpi/ic_stat_authentication.png | Bin 648 -> 446 bytes .../res/drawable-hdpi/ic_timer_grey600_24dp.png | Bin 640 -> 0 bytes .../main/res/drawable-hdpi/ic_timer_white_24dp.png | Bin 609 -> 0 bytes .../main/res/drawable-hdpi/ic_toc_grey600_36dp.png | Bin 229 -> 0 bytes .../main/res/drawable-hdpi/ic_toc_white_36dp.png | Bin 240 -> 0 bytes .../main/res/drawable-hdpi/ic_web_grey600_24dp.png | Bin 248 -> 162 bytes .../main/res/drawable-hdpi/ic_web_white_24dp.png | Bin 245 -> 159 bytes .../main/res/drawable-hdpi/ic_widget_preview.png | Bin 18320 -> 8210 bytes core/src/main/res/drawable-hdpi/navigation_up.png | Bin 2270 -> 318 bytes .../main/res/drawable-hdpi/navigation_up_dark.png | Bin 2221 -> 309 bytes .../main/res/drawable-hdpi/stat_notify_sync.png | Bin 421 -> 333 bytes .../res/drawable-hdpi/stat_notify_sync_error.png | Bin 436 -> 352 bytes .../drawable-ldpi-v11/ic_stat_antenna_default.png | Bin 307 -> 259 bytes core/src/main/res/drawable-ldpi/ic_launcher.png | Bin 1658 -> 1645 bytes .../res/drawable-ldpi/ic_stat_antenna_default.png | Bin 271 -> 202 bytes .../drawable-mdpi-v11/ic_stat_antenna_default.png | Bin 414 -> 349 bytes .../drawable-mdpi-v11/ic_stat_authentication.png | Bin 293 -> 244 bytes .../main/res/drawable-mdpi/ic_add_grey600_24dp.png | Bin 174 -> 90 bytes .../main/res/drawable-mdpi/ic_add_white_24dp.png | Bin 174 -> 88 bytes .../res/drawable-mdpi/ic_av_fast_forward_80dp.png | Bin 760 -> 328 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 1765 -> 768 bytes .../ic_av_play_circle_outline_80dp.png | Bin 1858 -> 820 bytes .../main/res/drawable-mdpi/ic_av_rewind_80dp.png | Bin 853 -> 349 bytes .../res/drawable-mdpi/ic_cancel_grey600_24dp.png | Bin 401 -> 307 bytes .../res/drawable-mdpi/ic_cancel_white_24dp.png | Bin 393 -> 290 bytes .../drawable-mdpi/ic_check_box_grey600_24dp.png | Bin 397 -> 193 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 254 -> 116 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 230 -> 113 bytes .../res/drawable-mdpi/ic_check_box_white_24dp.png | Bin 331 -> 179 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 0 -> 133 bytes .../ic_create_new_folder_white_24dp.png | Bin 0 -> 132 bytes .../res/drawable-mdpi/ic_delete_grey600_24dp.png | Bin 199 -> 114 bytes .../res/drawable-mdpi/ic_delete_white_24dp.png | Bin 197 -> 112 bytes .../drawable-mdpi/ic_description_grey600_36dp.png | Bin 271 -> 0 bytes .../drawable-mdpi/ic_description_white_36dp.png | Bin 309 -> 0 bytes .../res/drawable-mdpi/ic_done_grey600_24dp.png | Bin 244 -> 132 bytes .../main/res/drawable-mdpi/ic_done_white_24dp.png | Bin 243 -> 133 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 253 -> 202 bytes .../ic_drag_vertical_white_48dp.9.png | Bin 231 -> 191 bytes .../drawable-mdpi/ic_expand_more_grey600_36dp.png | Bin 291 -> 160 bytes .../drawable-mdpi/ic_expand_more_white_36dp.png | Bin 290 -> 153 bytes .../drawable-mdpi/ic_fast_forward_grey600_24dp.png | Bin 276 -> 162 bytes .../drawable-mdpi/ic_fast_forward_grey600_36dp.png | Bin 366 -> 256 bytes .../drawable-mdpi/ic_fast_forward_white_24dp.png | Bin 265 -> 163 bytes .../drawable-mdpi/ic_fast_forward_white_36dp.png | Bin 360 -> 253 bytes .../drawable-mdpi/ic_fast_rewind_grey600_24dp.png | Bin 267 -> 167 bytes .../drawable-mdpi/ic_fast_rewind_grey600_36dp.png | Bin 395 -> 267 bytes .../drawable-mdpi/ic_fast_rewind_white_24dp.png | Bin 263 -> 162 bytes .../drawable-mdpi/ic_fast_rewind_white_36dp.png | Bin 376 -> 261 bytes .../res/drawable-mdpi/ic_feed_grey600_24dp.png | Bin 773 -> 353 bytes .../main/res/drawable-mdpi/ic_feed_white_24dp.png | Bin 492 -> 321 bytes .../ic_file_download_grey600_24dp.png | Bin 213 -> 115 bytes .../drawable-mdpi/ic_file_download_white_24dp.png | Bin 210 -> 113 bytes .../res/drawable-mdpi/ic_filter_grey600_24dp.png | Bin 111 -> 91 bytes .../res/drawable-mdpi/ic_filter_white_24dp.png | Bin 111 -> 90 bytes .../res/drawable-mdpi/ic_hearing_grey600_18dp.png | Bin 408 -> 324 bytes .../res/drawable-mdpi/ic_hearing_white_18dp.png | Bin 397 -> 301 bytes .../res/drawable-mdpi/ic_history_grey600_24dp.png | Bin 447 -> 345 bytes .../res/drawable-mdpi/ic_history_white_24dp.png | Bin 447 -> 345 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 259 -> 118 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 241 -> 115 bytes .../res/drawable-mdpi/ic_info_grey600_24dp.png | Bin 327 -> 233 bytes .../main/res/drawable-mdpi/ic_info_white_24dp.png | Bin 319 -> 224 bytes core/src/main/res/drawable-mdpi/ic_launcher.png | Bin 2382 -> 2359 bytes .../res/drawable-mdpi/ic_list_grey600_24dp.png | Bin 178 -> 88 bytes .../main/res/drawable-mdpi/ic_list_white_24dp.png | Bin 171 -> 86 bytes .../drawable-mdpi/ic_lock_closed_grey600_24dp.png | Bin 242 -> 205 bytes .../drawable-mdpi/ic_lock_closed_white_24dp.png | Bin 237 -> 199 bytes .../drawable-mdpi/ic_lock_open_grey600_24dp.png | Bin 242 -> 208 bytes .../res/drawable-mdpi/ic_lock_open_white_24dp.png | Bin 238 -> 198 bytes .../drawable-mdpi/ic_more_vert_grey600_24dp.png | Bin 202 -> 0 bytes .../res/drawable-mdpi/ic_more_vert_white_24dp.png | Bin 202 -> 0 bytes core/src/main/res/drawable-mdpi/ic_new.png | Bin 593 -> 0 bytes core/src/main/res/drawable-mdpi/ic_new_dark.png | Bin 484 -> 0 bytes .../drawable-mdpi/ic_new_releases_grey600_24dp.png | Bin 382 -> 288 bytes .../drawable-mdpi/ic_new_releases_white_24dp.png | Bin 378 -> 277 bytes .../res/drawable-mdpi/ic_pause_grey600_24dp.png | Bin 168 -> 84 bytes .../res/drawable-mdpi/ic_pause_grey600_36dp.png | Bin 188 -> 103 bytes .../main/res/drawable-mdpi/ic_pause_white_24dp.png | Bin 174 -> 83 bytes .../main/res/drawable-mdpi/ic_pause_white_36dp.png | Bin 188 -> 103 bytes .../drawable-mdpi/ic_play_arrow_grey600_24dp.png | Bin 248 -> 151 bytes .../drawable-mdpi/ic_play_arrow_grey600_36dp.png | Bin 301 -> 195 bytes .../res/drawable-mdpi/ic_play_arrow_white_24dp.png | Bin 257 -> 154 bytes .../res/drawable-mdpi/ic_play_arrow_white_36dp.png | Bin 282 -> 194 bytes .../res/drawable-mdpi/ic_refresh_grey600_24dp.png | Bin 356 -> 261 bytes .../res/drawable-mdpi/ic_refresh_white_24dp.png | Bin 346 -> 247 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 357 -> 265 bytes .../drawable-mdpi/ic_remove_red_eye_white_18dp.png | Bin 371 -> 259 bytes .../drawable-mdpi/ic_sd_storage_grey600_36dp.png | Bin 0 -> 181 bytes .../res/drawable-mdpi/ic_sd_storage_white_36dp.png | Bin 0 -> 172 bytes .../res/drawable-mdpi/ic_search_grey600_24dp.png | Bin 356 -> 263 bytes .../res/drawable-mdpi/ic_search_white_24dp.png | Bin 346 -> 247 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 491 -> 388 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 473 -> 371 bytes .../res/drawable-mdpi/ic_share_grey600_24dp.png | Bin 371 -> 269 bytes .../main/res/drawable-mdpi/ic_share_white_24dp.png | Bin 361 -> 261 bytes .../res/drawable-mdpi/ic_skip_grey600_36dp.png | Bin 218 -> 183 bytes .../main/res/drawable-mdpi/ic_skip_white_36dp.png | Bin 216 -> 183 bytes .../res/drawable-mdpi/ic_sleep_grey600_24dp.png | Bin 336 -> 140 bytes .../drawable-mdpi/ic_sleep_off_grey600_24dp.png | Bin 472 -> 225 bytes .../res/drawable-mdpi/ic_sleep_off_white_24dp.png | Bin 323 -> 203 bytes .../main/res/drawable-mdpi/ic_sleep_white_24dp.png | Bin 252 -> 139 bytes .../res/drawable-mdpi/ic_sort_grey600_24dp.png | Bin 193 -> 91 bytes .../main/res/drawable-mdpi/ic_sort_white_24dp.png | Bin 192 -> 90 bytes .../drawable-mdpi/ic_star_border_grey600_24dp.png | Bin 410 -> 354 bytes .../drawable-mdpi/ic_star_border_white_24dp.png | Bin 410 -> 342 bytes .../res/drawable-mdpi/ic_star_grey600_24dp.png | Bin 307 -> 274 bytes .../main/res/drawable-mdpi/ic_star_white_24dp.png | Bin 302 -> 265 bytes .../res/drawable-mdpi/ic_stat_antenna_default.png | Bin 412 -> 297 bytes .../res/drawable-mdpi/ic_stat_authentication.png | Bin 460 -> 317 bytes .../res/drawable-mdpi/ic_timer_grey600_24dp.png | Bin 442 -> 0 bytes .../main/res/drawable-mdpi/ic_timer_white_24dp.png | Bin 420 -> 0 bytes .../main/res/drawable-mdpi/ic_toc_grey600_36dp.png | Bin 205 -> 0 bytes .../main/res/drawable-mdpi/ic_toc_white_36dp.png | Bin 205 -> 0 bytes .../main/res/drawable-mdpi/ic_web_grey600_24dp.png | Bin 212 -> 123 bytes .../main/res/drawable-mdpi/ic_web_white_24dp.png | Bin 211 -> 122 bytes core/src/main/res/drawable-mdpi/navigation_up.png | Bin 2123 -> 279 bytes .../main/res/drawable-mdpi/navigation_up_dark.png | Bin 2060 -> 267 bytes .../main/res/drawable-mdpi/stat_notify_sync.png | Bin 272 -> 227 bytes .../res/drawable-mdpi/stat_notify_sync_error.png | Bin 274 -> 241 bytes .../drawable-xhdpi-v11/ic_stat_antenna_default.png | Bin 1005 -> 783 bytes .../drawable-xhdpi-v11/ic_stat_authentication.png | Bin 529 -> 418 bytes .../res/drawable-xhdpi/ic_add_grey600_24dp.png | Bin 199 -> 109 bytes .../main/res/drawable-xhdpi/ic_add_white_24dp.png | Bin 198 -> 97 bytes .../res/drawable-xhdpi/ic_av_fast_forward_80dp.png | Bin 1968 -> 575 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 5191 -> 1889 bytes .../ic_av_play_circle_outline_80dp.png | Bin 5393 -> 1994 bytes .../main/res/drawable-xhdpi/ic_av_rewind_80dp.png | Bin 1992 -> 603 bytes .../res/drawable-xhdpi/ic_cancel_grey600_24dp.png | Bin 661 -> 537 bytes .../res/drawable-xhdpi/ic_cancel_white_24dp.png | Bin 645 -> 513 bytes .../drawable-xhdpi/ic_check_box_grey600_24dp.png | Bin 658 -> 305 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 406 -> 186 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 364 -> 165 bytes .../res/drawable-xhdpi/ic_check_box_white_24dp.png | Bin 526 -> 282 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 0 -> 198 bytes .../ic_create_new_folder_white_24dp.png | Bin 0 -> 188 bytes .../res/drawable-xhdpi/ic_delete_grey600_24dp.png | Bin 271 -> 153 bytes .../res/drawable-xhdpi/ic_delete_white_24dp.png | Bin 270 -> 146 bytes .../drawable-xhdpi/ic_description_grey600_36dp.png | Bin 461 -> 0 bytes .../drawable-xhdpi/ic_description_white_36dp.png | Bin 459 -> 0 bytes .../res/drawable-xhdpi/ic_done_grey600_24dp.png | Bin 373 -> 189 bytes .../main/res/drawable-xhdpi/ic_done_white_24dp.png | Bin 363 -> 183 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 548 -> 379 bytes .../ic_drag_vertical_white_48dp.9.png | Bin 517 -> 349 bytes .../drawable-xhdpi/ic_expand_more_grey600_36dp.png | Bin 411 -> 223 bytes .../drawable-xhdpi/ic_expand_more_white_36dp.png | Bin 406 -> 218 bytes .../ic_fast_forward_grey600_24dp.png | Bin 383 -> 252 bytes .../ic_fast_forward_grey600_36dp.png | Bin 497 -> 332 bytes .../drawable-xhdpi/ic_fast_forward_white_24dp.png | Bin 386 -> 253 bytes .../drawable-xhdpi/ic_fast_forward_white_36dp.png | Bin 496 -> 327 bytes .../drawable-xhdpi/ic_fast_rewind_grey600_24dp.png | Bin 405 -> 279 bytes .../drawable-xhdpi/ic_fast_rewind_grey600_36dp.png | Bin 523 -> 348 bytes .../drawable-xhdpi/ic_fast_rewind_white_24dp.png | Bin 399 -> 263 bytes .../drawable-xhdpi/ic_fast_rewind_white_36dp.png | Bin 511 -> 331 bytes .../res/drawable-xhdpi/ic_feed_grey600_24dp.png | Bin 1420 -> 645 bytes .../main/res/drawable-xhdpi/ic_feed_white_24dp.png | Bin 910 -> 572 bytes .../ic_file_download_grey600_24dp.png | Bin 283 -> 148 bytes .../drawable-xhdpi/ic_file_download_white_24dp.png | Bin 282 -> 143 bytes .../res/drawable-xhdpi/ic_filter_grey600_24dp.png | Bin 141 -> 106 bytes .../res/drawable-xhdpi/ic_filter_white_24dp.png | Bin 141 -> 103 bytes .../res/drawable-xhdpi/ic_hearing_grey600_18dp.png | Bin 759 -> 621 bytes .../res/drawable-xhdpi/ic_hearing_white_18dp.png | Bin 724 -> 588 bytes .../res/drawable-xhdpi/ic_history_grey600_24dp.png | Bin 769 -> 636 bytes .../res/drawable-xhdpi/ic_history_white_24dp.png | Bin 770 -> 634 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 407 -> 186 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 370 -> 166 bytes .../res/drawable-xhdpi/ic_info_grey600_24dp.png | Bin 547 -> 428 bytes .../main/res/drawable-xhdpi/ic_info_white_24dp.png | Bin 530 -> 411 bytes core/src/main/res/drawable-xhdpi/ic_launcher.png | Bin 5589 -> 5519 bytes .../res/drawable-xhdpi/ic_list_grey600_24dp.png | Bin 197 -> 104 bytes .../main/res/drawable-xhdpi/ic_list_white_24dp.png | Bin 196 -> 95 bytes .../drawable-xhdpi/ic_lock_closed_grey600_24dp.png | Bin 430 -> 355 bytes .../drawable-xhdpi/ic_lock_closed_white_24dp.png | Bin 421 -> 341 bytes .../drawable-xhdpi/ic_lock_open_grey600_24dp.png | Bin 427 -> 355 bytes .../res/drawable-xhdpi/ic_lock_open_white_24dp.png | Bin 420 -> 341 bytes .../drawable-xhdpi/ic_more_vert_grey600_24dp.png | Bin 252 -> 0 bytes .../res/drawable-xhdpi/ic_more_vert_white_24dp.png | Bin 269 -> 0 bytes core/src/main/res/drawable-xhdpi/ic_new.png | Bin 1189 -> 0 bytes core/src/main/res/drawable-xhdpi/ic_new_dark.png | Bin 989 -> 0 bytes .../ic_new_releases_grey600_24dp.png | Bin 623 -> 496 bytes .../drawable-xhdpi/ic_new_releases_white_24dp.png | Bin 637 -> 464 bytes .../res/drawable-xhdpi/ic_pause_grey600_24dp.png | Bin 193 -> 105 bytes .../res/drawable-xhdpi/ic_pause_grey600_36dp.png | Bin 217 -> 109 bytes .../res/drawable-xhdpi/ic_pause_white_24dp.png | Bin 193 -> 90 bytes .../res/drawable-xhdpi/ic_pause_white_36dp.png | Bin 215 -> 92 bytes .../drawable-xhdpi/ic_play_arrow_grey600_24dp.png | Bin 319 -> 211 bytes .../drawable-xhdpi/ic_play_arrow_grey600_36dp.png | Bin 400 -> 270 bytes .../drawable-xhdpi/ic_play_arrow_white_24dp.png | Bin 318 -> 206 bytes .../drawable-xhdpi/ic_play_arrow_white_36dp.png | Bin 399 -> 270 bytes .../res/drawable-xhdpi/ic_refresh_grey600_24dp.png | Bin 644 -> 511 bytes .../res/drawable-xhdpi/ic_refresh_white_24dp.png | Bin 637 -> 484 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 589 -> 492 bytes .../ic_remove_red_eye_white_18dp.png | Bin 585 -> 472 bytes .../drawable-xhdpi/ic_sd_storage_grey600_36dp.png | Bin 0 -> 295 bytes .../drawable-xhdpi/ic_sd_storage_white_36dp.png | Bin 0 -> 284 bytes .../res/drawable-xhdpi/ic_search_grey600_24dp.png | Bin 597 -> 483 bytes .../res/drawable-xhdpi/ic_search_white_24dp.png | Bin 591 -> 453 bytes .../drawable-xhdpi/ic_settings_grey600_24dp.png | Bin 704 -> 581 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 834 -> 698 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 825 -> 675 bytes .../res/drawable-xhdpi/ic_settings_white_24dp.png | Bin 737 -> 540 bytes .../res/drawable-xhdpi/ic_share_grey600_24dp.png | Bin 629 -> 496 bytes .../res/drawable-xhdpi/ic_share_white_24dp.png | Bin 625 -> 472 bytes .../res/drawable-xhdpi/ic_skip_grey600_36dp.png | Bin 364 -> 285 bytes .../main/res/drawable-xhdpi/ic_skip_white_36dp.png | Bin 368 -> 285 bytes .../res/drawable-xhdpi/ic_sleep_grey600_24dp.png | Bin 494 -> 224 bytes .../drawable-xhdpi/ic_sleep_off_grey600_24dp.png | Bin 769 -> 358 bytes .../res/drawable-xhdpi/ic_sleep_off_white_24dp.png | Bin 486 -> 326 bytes .../res/drawable-xhdpi/ic_sleep_white_24dp.png | Bin 367 -> 208 bytes .../res/drawable-xhdpi/ic_sort_grey600_24dp.png | Bin 215 -> 106 bytes .../main/res/drawable-xhdpi/ic_sort_white_24dp.png | Bin 212 -> 101 bytes .../drawable-xhdpi/ic_star_border_grey600_24dp.png | Bin 828 -> 694 bytes .../drawable-xhdpi/ic_star_border_white_24dp.png | Bin 821 -> 630 bytes .../res/drawable-xhdpi/ic_star_grey600_24dp.png | Bin 593 -> 487 bytes .../main/res/drawable-xhdpi/ic_star_white_24dp.png | Bin 582 -> 455 bytes .../res/drawable-xhdpi/ic_stat_antenna_default.png | Bin 942 -> 693 bytes .../res/drawable-xhdpi/ic_stat_authentication.png | Bin 882 -> 584 bytes .../res/drawable-xhdpi/ic_timer_grey600_24dp.png | Bin 761 -> 0 bytes .../res/drawable-xhdpi/ic_timer_white_24dp.png | Bin 810 -> 0 bytes .../res/drawable-xhdpi/ic_toc_grey600_36dp.png | Bin 222 -> 0 bytes .../main/res/drawable-xhdpi/ic_toc_white_36dp.png | Bin 229 -> 0 bytes .../main/res/drawable-xhdpi/ic_undobar_undo.png | Bin 1558 -> 0 bytes .../res/drawable-xhdpi/ic_web_grey600_24dp.png | Bin 282 -> 190 bytes .../main/res/drawable-xhdpi/ic_web_white_24dp.png | Bin 319 -> 182 bytes core/src/main/res/drawable-xhdpi/navigation_up.png | Bin 2471 -> 409 bytes .../main/res/drawable-xhdpi/navigation_up_dark.png | Bin 2445 -> 408 bytes .../main/res/drawable-xhdpi/stat_notify_sync.png | Bin 475 -> 368 bytes .../res/drawable-xhdpi/stat_notify_sync_error.png | Bin 533 -> 415 bytes core/src/main/res/drawable-xhdpi/undobar.9.png | Bin 1665 -> 0 bytes .../drawable-xhdpi/undobar_button_focused.9.png | Bin 1141 -> 0 bytes .../drawable-xhdpi/undobar_button_pressed.9.png | Bin 1123 -> 0 bytes .../main/res/drawable-xhdpi/undobar_divider.9.png | Bin 963 -> 0 bytes .../res/drawable-xxhdpi/ic_add_grey600_24dp.png | Bin 223 -> 114 bytes .../main/res/drawable-xxhdpi/ic_add_white_24dp.png | Bin 222 -> 97 bytes .../drawable-xxhdpi/ic_av_fast_forward_80dp.png | Bin 3207 -> 831 bytes .../ic_av_pause_circle_outline_80dp.png | Bin 8059 -> 2745 bytes .../ic_av_play_circle_outline_80dp.png | Bin 8216 -> 2987 bytes .../main/res/drawable-xxhdpi/ic_av_rewind_80dp.png | Bin 3502 -> 757 bytes .../res/drawable-xxhdpi/ic_cancel_grey600_24dp.png | Bin 920 -> 756 bytes .../res/drawable-xxhdpi/ic_cancel_white_24dp.png | Bin 893 -> 716 bytes .../drawable-xxhdpi/ic_check_box_grey600_24dp.png | Bin 920 -> 415 bytes .../ic_check_box_outline_blank_grey600_24dp.png | Bin 582 -> 244 bytes .../ic_check_box_outline_blank_white_24dp.png | Bin 502 -> 214 bytes .../drawable-xxhdpi/ic_check_box_white_24dp.png | Bin 800 -> 383 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 0 -> 262 bytes .../ic_create_new_folder_white_24dp.png | Bin 0 -> 251 bytes .../res/drawable-xxhdpi/ic_delete_grey600_24dp.png | Bin 341 -> 195 bytes .../res/drawable-xxhdpi/ic_delete_white_24dp.png | Bin 338 -> 189 bytes .../ic_description_grey600_36dp.png | Bin 635 -> 0 bytes .../drawable-xxhdpi/ic_description_white_36dp.png | Bin 626 -> 0 bytes .../res/drawable-xxhdpi/ic_done_grey600_24dp.png | Bin 451 -> 262 bytes .../res/drawable-xxhdpi/ic_done_white_24dp.png | Bin 476 -> 252 bytes .../ic_drag_vertical_grey600_48dp.9.png | Bin 853 -> 593 bytes .../ic_drag_vertical_white_48dp.9.png | Bin 809 -> 544 bytes .../ic_expand_more_grey600_36dp.png | Bin 539 -> 278 bytes .../drawable-xxhdpi/ic_expand_more_white_36dp.png | Bin 539 -> 273 bytes .../ic_fast_forward_grey600_24dp.png | Bin 497 -> 332 bytes .../ic_fast_forward_grey600_36dp.png | Bin 689 -> 520 bytes .../drawable-xxhdpi/ic_fast_forward_white_24dp.png | Bin 496 -> 327 bytes .../drawable-xxhdpi/ic_fast_forward_white_36dp.png | Bin 689 -> 518 bytes .../ic_fast_rewind_grey600_24dp.png | Bin 523 -> 348 bytes .../ic_fast_rewind_grey600_36dp.png | Bin 704 -> 547 bytes .../drawable-xxhdpi/ic_fast_rewind_white_24dp.png | Bin 511 -> 331 bytes .../drawable-xxhdpi/ic_fast_rewind_white_36dp.png | Bin 708 -> 548 bytes .../res/drawable-xxhdpi/ic_feed_grey600_24dp.png | Bin 2087 -> 956 bytes .../res/drawable-xxhdpi/ic_feed_white_24dp.png | Bin 1366 -> 843 bytes .../ic_file_download_grey600_24dp.png | Bin 353 -> 182 bytes .../ic_file_download_white_24dp.png | Bin 351 -> 177 bytes .../res/drawable-xxhdpi/ic_filter_grey600_24dp.png | Bin 189 -> 114 bytes .../res/drawable-xxhdpi/ic_filter_white_24dp.png | Bin 188 -> 107 bytes .../drawable-xxhdpi/ic_hearing_grey600_18dp.png | Bin 1041 -> 885 bytes .../res/drawable-xxhdpi/ic_hearing_white_18dp.png | Bin 1034 -> 840 bytes .../drawable-xxhdpi/ic_history_grey600_24dp.png | Bin 1121 -> 950 bytes .../res/drawable-xxhdpi/ic_history_white_24dp.png | Bin 1123 -> 952 bytes .../ic_indeterminate_check_box_grey600_24dp.png | Bin 580 -> 247 bytes .../ic_indeterminate_check_box_white_24dp.png | Bin 514 -> 219 bytes .../res/drawable-xxhdpi/ic_info_grey600_24dp.png | Bin 762 -> 611 bytes .../res/drawable-xxhdpi/ic_info_white_24dp.png | Bin 736 -> 576 bytes core/src/main/res/drawable-xxhdpi/ic_launcher.png | Bin 14262 -> 9483 bytes .../res/drawable-xxhdpi/ic_list_grey600_24dp.png | Bin 223 -> 111 bytes .../res/drawable-xxhdpi/ic_list_white_24dp.png | Bin 230 -> 94 bytes .../ic_lock_closed_grey600_24dp.png | Bin 630 -> 518 bytes .../drawable-xxhdpi/ic_lock_closed_white_24dp.png | Bin 621 -> 494 bytes .../drawable-xxhdpi/ic_lock_open_grey600_24dp.png | Bin 627 -> 519 bytes .../drawable-xxhdpi/ic_lock_open_white_24dp.png | Bin 621 -> 496 bytes .../drawable-xxhdpi/ic_more_vert_grey600_24dp.png | Bin 316 -> 0 bytes .../drawable-xxhdpi/ic_more_vert_white_24dp.png | Bin 313 -> 0 bytes core/src/main/res/drawable-xxhdpi/ic_new.png | Bin 1759 -> 0 bytes core/src/main/res/drawable-xxhdpi/ic_new_dark.png | Bin 1501 -> 0 bytes .../ic_new_releases_grey600_24dp.png | Bin 881 -> 718 bytes .../drawable-xxhdpi/ic_new_releases_white_24dp.png | Bin 858 -> 679 bytes .../res/drawable-xxhdpi/ic_pause_grey600_24dp.png | Bin 217 -> 109 bytes .../res/drawable-xxhdpi/ic_pause_grey600_36dp.png | Bin 294 -> 143 bytes .../res/drawable-xxhdpi/ic_pause_white_24dp.png | Bin 215 -> 92 bytes .../res/drawable-xxhdpi/ic_pause_white_36dp.png | Bin 293 -> 143 bytes .../drawable-xxhdpi/ic_play_arrow_grey600_24dp.png | Bin 400 -> 270 bytes .../drawable-xxhdpi/ic_play_arrow_grey600_36dp.png | Bin 544 -> 367 bytes .../drawable-xxhdpi/ic_play_arrow_white_24dp.png | Bin 399 -> 270 bytes .../drawable-xxhdpi/ic_play_arrow_white_36dp.png | Bin 543 -> 351 bytes .../drawable-xxhdpi/ic_refresh_grey600_24dp.png | Bin 882 -> 741 bytes .../res/drawable-xxhdpi/ic_refresh_white_24dp.png | Bin 875 -> 689 bytes .../ic_remove_red_eye_grey600_18dp.png | Bin 826 -> 697 bytes .../ic_remove_red_eye_white_18dp.png | Bin 862 -> 669 bytes .../drawable-xxhdpi/ic_sd_storage_grey600_36dp.png | Bin 0 -> 439 bytes .../drawable-xxhdpi/ic_sd_storage_white_36dp.png | Bin 0 -> 416 bytes .../res/drawable-xxhdpi/ic_search_grey600_24dp.png | Bin 881 -> 712 bytes .../res/drawable-xxhdpi/ic_search_white_24dp.png | Bin 871 -> 669 bytes .../drawable-xxhdpi/ic_settings_grey600_24dp.png | Bin 994 -> 844 bytes .../ic_settings_input_antenna_grey600_24dp.png | Bin 1231 -> 1063 bytes .../ic_settings_input_antenna_white_24dp.png | Bin 1219 -> 1019 bytes .../res/drawable-xxhdpi/ic_settings_white_24dp.png | Bin 974 -> 790 bytes .../res/drawable-xxhdpi/ic_share_grey600_24dp.png | Bin 866 -> 694 bytes .../res/drawable-xxhdpi/ic_share_white_24dp.png | Bin 857 -> 660 bytes .../res/drawable-xxhdpi/ic_skip_grey600_36dp.png | Bin 533 -> 369 bytes .../res/drawable-xxhdpi/ic_skip_white_36dp.png | Bin 543 -> 361 bytes .../res/drawable-xxhdpi/ic_sleep_grey600_24dp.png | Bin 737 -> 311 bytes .../drawable-xxhdpi/ic_sleep_off_grey600_24dp.png | Bin 1113 -> 495 bytes .../drawable-xxhdpi/ic_sleep_off_white_24dp.png | Bin 664 -> 449 bytes .../res/drawable-xxhdpi/ic_sleep_white_24dp.png | Bin 509 -> 280 bytes .../res/drawable-xxhdpi/ic_sort_grey600_24dp.png | Bin 244 -> 115 bytes .../res/drawable-xxhdpi/ic_sort_white_24dp.png | Bin 241 -> 103 bytes .../ic_star_border_grey600_24dp.png | Bin 1227 -> 1009 bytes .../drawable-xxhdpi/ic_star_border_white_24dp.png | Bin 1222 -> 934 bytes .../res/drawable-xxhdpi/ic_star_grey600_24dp.png | Bin 877 -> 703 bytes .../res/drawable-xxhdpi/ic_star_white_24dp.png | Bin 870 -> 657 bytes .../res/drawable-xxhdpi/ic_stat_authentication.png | Bin 1266 -> 848 bytes .../res/drawable-xxhdpi/ic_timer_grey600_24dp.png | Bin 1074 -> 0 bytes .../res/drawable-xxhdpi/ic_timer_white_24dp.png | Bin 1063 -> 0 bytes .../res/drawable-xxhdpi/ic_toc_grey600_36dp.png | Bin 313 -> 0 bytes .../main/res/drawable-xxhdpi/ic_toc_white_36dp.png | Bin 312 -> 0 bytes .../res/drawable-xxhdpi/ic_web_grey600_24dp.png | Bin 402 -> 245 bytes .../main/res/drawable-xxhdpi/ic_web_white_24dp.png | Bin 408 -> 234 bytes .../main/res/drawable-xxhdpi/stat_notify_sync.png | Bin 705 -> 545 bytes .../res/drawable-xxhdpi/stat_notify_sync_error.png | Bin 761 -> 577 bytes .../drawable-xxxhdpi/ic_av_fast_forward_80dp.png | Bin 5878 -> 1332 bytes .../res/drawable-xxxhdpi/ic_av_rewind_80dp.png | Bin 6299 -> 1362 bytes .../ic_create_new_folder_grey600_24dp.png | Bin 0 -> 331 bytes .../ic_create_new_folder_white_24dp.png | Bin 0 -> 314 bytes .../drawable-xxxhdpi/ic_filter_grey600_24dp.png | Bin 235 -> 123 bytes .../res/drawable-xxxhdpi/ic_filter_white_24dp.png | Bin 234 -> 106 bytes .../ic_lock_closed_grey600_24dp.png | Bin 854 -> 675 bytes .../drawable-xxxhdpi/ic_lock_closed_white_24dp.png | Bin 839 -> 646 bytes .../drawable-xxxhdpi/ic_lock_open_grey600_24dp.png | Bin 850 -> 674 bytes .../drawable-xxxhdpi/ic_lock_open_white_24dp.png | Bin 838 -> 643 bytes .../ic_sd_storage_grey600_36dp.png | Bin 0 -> 583 bytes .../drawable-xxxhdpi/ic_sd_storage_white_36dp.png | Bin 0 -> 559 bytes .../res/drawable-xxxhdpi/ic_skip_grey600_36dp.png | Bin 737 -> 443 bytes .../res/drawable-xxxhdpi/ic_skip_white_36dp.png | Bin 749 -> 433 bytes .../res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png | Bin 955 -> 403 bytes .../drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png | Bin 1514 -> 637 bytes .../drawable-xxxhdpi/ic_sleep_off_white_24dp.png | Bin 882 -> 580 bytes .../res/drawable-xxxhdpi/ic_sleep_white_24dp.png | Bin 647 -> 358 bytes .../ic_star_border_grey600_24dp.png | Bin 1675 -> 1352 bytes .../drawable-xxxhdpi/ic_star_border_white_24dp.png | Bin 1684 -> 1248 bytes .../res/drawable-xxxhdpi/ic_star_grey600_24dp.png | Bin 1179 -> 916 bytes .../res/drawable-xxxhdpi/ic_star_white_24dp.png | Bin 1183 -> 856 bytes core/src/main/res/drawable/undobar_button.xml | 22 - core/src/main/res/values-ar/strings.xml | 128 ++++++ core/src/main/res/values-ca-rES/strings.xml | 33 ++ core/src/main/res/values-ca/strings.xml | 66 +++ core/src/main/res/values-cs-rCZ/strings.xml | 13 + core/src/main/res/values-de/strings.xml | 13 + core/src/main/res/values-el/strings.xml | 358 +++++++++++++++ core/src/main/res/values-es/strings.xml | 19 + core/src/main/res/values-fi/strings.xml | 33 ++ core/src/main/res/values-fr/strings.xml | 12 + core/src/main/res/values-hu/strings.xml | 33 ++ core/src/main/res/values-id/strings.xml | 33 ++ core/src/main/res/values-it/strings.xml | 290 ++++++++++++ core/src/main/res/values-ja/strings.xml | 13 + core/src/main/res/values-kn-rIN/strings.xml | 103 +++++ core/src/main/res/values-ko-rKR/strings.xml | 33 ++ core/src/main/res/values-ko/strings.xml | 7 + core/src/main/res/values-nl/strings.xml | 26 +- core/src/main/res/values-no-rNB/strings.xml | 510 +++++++++++++++++++++ core/src/main/res/values-no/strings.xml | 33 ++ core/src/main/res/values-pl/strings.xml | 99 ++++ core/src/main/res/values-pt/strings.xml | 13 + core/src/main/res/values-sv-rSE/strings.xml | 13 + core/src/main/res/values-uk-rUA/strings.xml | 63 +++ core/src/main/res/values-vi-rVN/strings.xml | 33 ++ core/src/main/res/values-vi/strings.xml | 60 +++ core/src/main/res/values/attrs.xml | 5 +- core/src/main/res/values/strings.xml | 45 +- core/src/main/res/values/styles.xml | 22 +- 569 files changed, 4041 insertions(+), 1672 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java create mode 100644 core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png create mode 100644 core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-hdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-hdpi/ic_new_dark.png create mode 100644 core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png create mode 100644 core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png create mode 100644 core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png create mode 100644 core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-mdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-mdpi/ic_new_dark.png create mode 100644 core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png create mode 100644 core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png create mode 100644 core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png create mode 100644 core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-xhdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-xhdpi/ic_new_dark.png create mode 100644 core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png create mode 100644 core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png delete mode 100644 core/src/main/res/drawable-xhdpi/ic_undobar_undo.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png delete mode 100644 core/src/main/res/drawable-xhdpi/undobar_divider.9.png create mode 100644 core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png create mode 100644 core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png delete mode 100755 core/src/main/res/drawable-xxhdpi/ic_new.png delete mode 100755 core/src/main/res/drawable-xxhdpi/ic_new_dark.png create mode 100644 core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png create mode 100644 core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png delete mode 100644 core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png create mode 100644 core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png create mode 100644 core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png create mode 100644 core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png create mode 100644 core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png delete mode 100644 core/src/main/res/drawable/undobar_button.xml create mode 100644 core/src/main/res/values-ar/strings.xml create mode 100644 core/src/main/res/values-ca-rES/strings.xml create mode 100644 core/src/main/res/values-el/strings.xml create mode 100644 core/src/main/res/values-fi/strings.xml create mode 100644 core/src/main/res/values-hu/strings.xml create mode 100644 core/src/main/res/values-id/strings.xml create mode 100644 core/src/main/res/values-it/strings.xml create mode 100644 core/src/main/res/values-kn-rIN/strings.xml create mode 100644 core/src/main/res/values-ko-rKR/strings.xml create mode 100644 core/src/main/res/values-no-rNB/strings.xml create mode 100644 core/src/main/res/values-no/strings.xml create mode 100644 core/src/main/res/values-pl/strings.xml create mode 100644 core/src/main/res/values-vi-rVN/strings.xml create mode 100644 core/src/main/res/values-vi/strings.xml (limited to 'core/src') 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/ClientConfig.java b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java index 6619e706b..a96affb23 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java @@ -1,5 +1,12 @@ package de.danoeh.antennapod.core; +import android.content.Context; + +import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.core.util.NetworkUtils; + /** * Stores callbacks for core classes like Services, DB classes etc. and other configuration variables. * Apps using the core module of AntennaPod should register implementations of all interfaces here. @@ -22,4 +29,19 @@ public class ClientConfig { public static FlattrCallbacks flattrCallbacks; public static DBTasksCallbacks dbTasksCallbacks; + + private static boolean initialized = false; + + public static synchronized void initialize(Context context) { + if(initialized) { + return; + } + PodDBAdapter.init(context); + UserPreferences.init(context); + UpdateManager.init(context); + PlaybackPreferences.init(context); + NetworkUtils.init(context); + initialized = true; + } + } 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/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java new file mode 100644 index 000000000..8362c4a4e --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java @@ -0,0 +1,97 @@ +package de.danoeh.antennapod.core; + + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.util.Log; + +import org.antennapod.audio.MediaPlayer; + +import java.io.File; +import java.util.List; + +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; + +/* + * This class's job is do perform maintenance tasks whenever the app has been updated + */ +public class UpdateManager { + + public static final String TAG = UpdateManager.class.getSimpleName(); + + private static final String PREF_NAME = "app_version"; + private static final String KEY_VERSION_CODE = "version_code"; + + private static int currentVersionCode; + + private static Context context; + private static SharedPreferences prefs; + + public static void init(Context context) { + UpdateManager.context = context; + prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + PackageManager pm = context.getPackageManager(); + try { + PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); + currentVersionCode = info.versionCode; + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Failed to obtain package info for package name: " + context.getPackageName(), e); + currentVersionCode = 0; + return; + } + final int oldVersionCode = getStoredVersionCode(); + Log.d(TAG, "old: " + oldVersionCode + ", current: " + currentVersionCode); + if(oldVersionCode < currentVersionCode) { + onUpgrade(oldVersionCode, currentVersionCode); + setCurrentVersionCode(); + } + } + + public static int getStoredVersionCode() { + return prefs.getInt(KEY_VERSION_CODE, -1); + } + + public static void setCurrentVersionCode() { + prefs.edit().putInt(KEY_VERSION_CODE, currentVersionCode).apply(); + } + + private static void onUpgrade(final int oldVersionCode, final int newVersionCode) { + if(oldVersionCode < 1030099) { + // delete the now obsolete image cache + // from now on, Glide will handle caching images + new Thread() { + public void run() { + List feeds = DBReader.getFeedList(); + for (Feed podcast : feeds) { + List episodes = DBReader.getFeedItemList(podcast); + for (FeedItem episode : episodes) { + FeedImage image = episode.getImage(); + if (image != null && image.isDownloaded() && image.getFile_url() != null) { + File imageFile = new File(image.getFile_url()); + if (imageFile.exists()) { + imageFile.delete(); + } + image.setFile_url(null); // calls setDownloaded(false) + DBWriter.setFeedImage(image); + } + } + } + } + }.start(); + } + if(oldVersionCode < 1050004) { + if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) { + UserPreferences.enableSonic(true); + } + } + } + +} 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 ac032fcc0..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 @@ -17,6 +17,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.ClientConfig; @@ -44,10 +45,10 @@ 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()); @@ -114,12 +115,12 @@ public class FlattrClickWorker extends AsyncTask 0) { + if (countFailed.get() > 0) { postFlattrFailedNotification(); } break; @@ -190,7 +189,8 @@ 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 5ea0ba904..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); } @@ -156,10 +155,9 @@ public class OpmlBackupAgent extends BackupAgentHelper { ArrayList opmlElements = new OpmlReader().readDocument(reader); mChecksum = digester == null ? null : digester.digest(); DownloadRequester downloader = DownloadRequester.getInstance(); - Date lastUpdated = new Date(); for (OpmlElement opmlElem : opmlElements) { - Feed feed = new Feed(opmlElem.getXmlUrl(), lastUpdated, opmlElem.getText()); + Feed feed = new Feed(opmlElem.getXmlUrl(), null, opmlElem.getText()); try { downloader.downloadFeed(mContext, feed); 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 4be788f33..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 @@ -44,10 +44,12 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { private String author; private FeedImage image; private List items; + /** - * Date of last refresh. + * String that identifies the last update (adopted from Last-Modified or ETag header) */ - private Date lastUpdate; + private String lastUpdate; + private FlattrStatus flattrStatus; private String paymentLink; /** @@ -91,18 +93,14 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { /** * This constructor is used for restoring a feed from the database. */ - public Feed(long id, Date lastUpdate, String title, String link, String description, String paymentLink, + public Feed(long id, String lastUpdate, String title, String link, String description, String paymentLink, String author, String language, String type, String feedIdentifier, FeedImage image, String fileUrl, String downloadUrl, boolean downloaded, FlattrStatus status, boolean paged, String nextPageLink, String filter, boolean lastUpdateFailed) { super(fileUrl, downloadUrl, downloaded); this.id = id; this.title = title; - if (lastUpdate != null) { - this.lastUpdate = (Date) lastUpdate.clone(); - } else { - this.lastUpdate = null; - } + this.lastUpdate = lastUpdate; this.link = link; this.description = description; this.paymentLink = paymentLink; @@ -114,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 { @@ -126,7 +124,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { /** * This constructor is used for test purposes and uses a default flattr status object. */ - public Feed(long id, Date lastUpdate, String title, String link, String description, String paymentLink, + public Feed(long id, String lastUpdate, String title, String link, String description, String paymentLink, String author, String language, String type, String feedIdentifier, FeedImage image, String fileUrl, String downloadUrl, boolean downloaded) { this(id, lastUpdate, title, link, description, paymentLink, author, language, type, feedIdentifier, image, @@ -138,7 +136,6 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { */ public Feed() { super(); - lastUpdate = new Date(); this.flattrStatus = new FlattrStatus(); } @@ -146,9 +143,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { * This constructor is used for requesting a feed download (it must not be used for anything else!). It should NOT be * used if the title of the feed is already known. */ - public Feed(String url, Date lastUpdate) { + public Feed(String url, String lastUpdate) { super(null, url, false); - this.lastUpdate = (lastUpdate != null) ? (Date) lastUpdate.clone() : null; + this.lastUpdate = lastUpdate; this.flattrStatus = new FlattrStatus(); } @@ -156,7 +153,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { * This constructor is used for requesting a feed download (it must not be used for anything else!). It should be * used if the title of the feed is already known. */ - public Feed(String url, Date lastUpdate, String title) { + public Feed(String url, String lastUpdate, String title) { this(url, lastUpdate); this.title = title; this.flattrStatus = new FlattrStatus(); @@ -166,7 +163,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { * This constructor is used for requesting a feed download (it must not be used for anything else!). It should be * used if the title of the feed is already known. */ - public Feed(String url, Date lastUpdate, String title, String username, String password) { + public Feed(String url, String lastUpdate, String title, String username, String password) { this(url, lastUpdate, title); preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, username, password); } @@ -191,11 +188,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { int indexHide = cursor.getColumnIndex(PodDBAdapter.KEY_HIDE); int indexLastUpdateFailed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_UPDATE_FAILED); - Date lastUpdate = new Date(cursor.getLong(indexLastUpdate)); - Feed feed = new Feed( cursor.getLong(indexId), - lastUpdate, + cursor.getString(indexLastUpdate), cursor.getString(indexTitle), cursor.getString(indexLink), cursor.getString(indexDescription), @@ -240,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; } } @@ -329,12 +324,11 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { if (super.compareWithOther(other)) { return true; } - if (!title.equals(other.title)) { + if (!TextUtils.equals(title, other.title)) { return true; } if (other.feedIdentifier != null) { - if (feedIdentifier == null - || !feedIdentifier.equals(other.feedIdentifier)) { + if (feedIdentifier == null || !feedIdentifier.equals(other.feedIdentifier)) { return true; } } @@ -430,12 +424,12 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { this.items = list; } - public Date getLastUpdate() { - return (lastUpdate != null) ? (Date) lastUpdate.clone() : null; + public String getLastUpdate() { + return lastUpdate; } - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = (lastUpdate != null) ? (Date) lastUpdate.clone() : null; + public void setLastUpdate(String lastModified) { + this.lastUpdate = lastModified; } public String getFeedIdentifier() { 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/FeedFile.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java index 3dc58654b..ca9af058b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.feed; +import android.text.TextUtils; + import java.io.File; /** @@ -54,7 +56,7 @@ public abstract class FeedFile extends FeedComponent { if (super.compareWithOther(other)) { return true; } - if (!download_url.equals(other.download_url)) { + if (!TextUtils.equals(download_url, other.download_url)) { return true; } return false; 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..4921c0576 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) { @@ -196,6 +195,8 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr if (other.media != null) { if (media == null) { setMedia(other.media); + // reset to new if feed item did link to a file before + setNew(); } else if (media.compareWithOther(other.media)) { media.updateFromOther(other.media); } @@ -359,24 +360,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 56b996d1c..991499316 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -8,7 +8,6 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; -import android.text.TextUtils; import java.util.Date; import java.util.List; @@ -168,10 +167,6 @@ public class FeedMedia extends FeedFile implements Playable { } public void updateFromOther(FeedMedia other) { - // reset to new if feed item did link to a file before - if(TextUtils.isEmpty(download_url) && !TextUtils.isEmpty(other.download_url)) { - item.setNew(); - } super.updateFromOther(other); if (other.size > 0) { size = other.size; @@ -386,11 +381,14 @@ public class FeedMedia extends FeedFile implements Playable { // check if chapters are stored in db and not loaded yet. if (item != null && item.hasChapters() && item.getChapters() == null) { DBReader.loadChaptersOfFeedItem(item); - } else if (item != null && item.getChapters() == null && !localFileAvailable()) { - ChapterUtils.loadChaptersFromStreamUrl(this); + } else if (item != null && item.getChapters() == null) { + if(localFileAvailable()) { + ChapterUtils.loadChaptersFromFileUrl(this); + } else { + ChapterUtils.loadChaptersFromStreamUrl(this); + } if (getChapters() != null && item != null) { - DBWriter.setFeedItem( - item); + DBWriter.setFeedItem(item); } } } @@ -400,10 +398,10 @@ public class FeedMedia extends FeedFile implements Playable { if (item == null) { return null; } - if (getItem().getTitle() != null) { - return getItem().getTitle(); + if (item.getTitle() != null) { + return item.getTitle(); } else { - return getItem().getIdentifyingValue(); + return item.getIdentifyingValue(); } } @@ -412,7 +410,7 @@ public class FeedMedia extends FeedFile implements Playable { if (item == null) { return null; } - return getItem().getChapters(); + return item.getChapters(); } @Override @@ -420,15 +418,15 @@ public class FeedMedia extends FeedFile implements Playable { if (item == null) { return null; } - return getItem().getLink(); + return item.getLink(); } @Override public String getFeedTitle() { - if (item == null) { + if (item == null || item.getFeed() == null) { return null; } - return getItem().getFeed().getTitle(); + return item.getFeed().getTitle(); } @Override @@ -451,7 +449,7 @@ public class FeedMedia extends FeedFile implements Playable { if (item == null) { return null; } - return getItem().getPaymentLink(); + return item.getPaymentLink(); } @Override @@ -489,25 +487,24 @@ public class FeedMedia extends FeedFile implements Playable { @Override public void setChapters(List chapters) { - getItem().setChapters(chapters); + if(item != null) { + item.setChapters(chapters); + } } @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 faf23a37a..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; } @@ -95,8 +95,9 @@ public class FeedPreferences { * @return True if the two objects are different. */ public boolean compareWithOther(FeedPreferences other) { - if (other == null) + if (other == null) { return true; + } if (!TextUtils.equals(username, other.username)) { return true; } 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..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 @@ -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,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/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java index a24e3a485..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,16 +731,22 @@ 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++) { - added.add(jsonAdded.getString(i)); + String addedUrl = jsonAdded.getString(i); + // gpodder escapes colons unnecessarily + addedUrl = addedUrl.replace("%3A", ":"); + added.add(addedUrl); } - List removed = new LinkedList(); + List removed = new LinkedList<>(); JSONArray jsonRemoved = object.getJSONArray("remove"); for (int i = 0; i < jsonRemoved.length(); i++) { - removed.add(jsonRemoved.getString(i)); + String removedUrl = jsonRemoved.getString(i); + // gpodder escapes colons unnecessarily + removedUrl = removedUrl.replace("%3A", ":"); + removed.add(removedUrl); } long timestamp = object.getLong("timestamp"); @@ -751,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 2d174a6bc..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.valueOf(fields[4]))) - .started(Integer.valueOf(fields[5])) - .position(Integer.valueOf(fields[6])) - .total(Integer.valueOf(fields[7])) + .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 6c0aff15e..a38f50cfc 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 @@ -17,6 +17,7 @@ import org.json.JSONException; import java.io.File; import java.io.IOException; +import java.net.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -25,10 +26,12 @@ import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver; +import de.danoeh.antennapod.core.service.download.ProxyConfig; import de.danoeh.antennapod.core.storage.APCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm; import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm; import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm; +import de.danoeh.antennapod.core.util.Converter; /** * Provides access to preferences set by the user in the settings screen. A @@ -78,6 +81,11 @@ public class UserPreferences { public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery"; public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter"; public static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks"; + public static final String PREF_PROXY_TYPE = "prefProxyType"; + public static final String PREF_PROXY_HOST = "prefProxyHost"; + public static final String PREF_PROXY_PORT = "prefProxyPort"; + public static final String PREF_PROXY_USER = "prefProxyUser"; + public static final String PREF_PROXY_PASSWORD = "prefProxyPassword"; // Services public static final String PREF_AUTO_FLATTR = "pref_auto_flattr"; @@ -104,6 +112,7 @@ public class UserPreferences { public static final int EPISODE_CLEANUP_QUEUE = -1; public static final int EPISODE_CLEANUP_NULL = -2; public static final int EPISODE_CLEANUP_DEFAULT = 0; + private static final String PREF_SHOW_SUBSCRIPTIONS_IN_DRAWER = "prefShowSubscriptionsInDrawer"; // Constants private static int EPISODE_CACHE_SIZE_UNLIMITED = -1; @@ -158,12 +167,16 @@ public class UserPreferences { public static int getFeedOrder() { String value = prefs.getString(PREF_DRAWER_FEED_ORDER, "0"); - return Integer.valueOf(value); + return Integer.parseInt(value); } public static int getFeedCounterSetting() { String value = prefs.getString(PREF_DRAWER_FEED_COUNTER, "0"); - return Integer.valueOf(value); + return Integer.parseInt(value); + } + + public static boolean showSubscriptionsInDrawer() { + return prefs.getBoolean(PREF_SHOW_SUBSCRIPTIONS_IN_DRAWER, true); } /** @@ -243,7 +256,7 @@ public class UserPreferences { } public static int getSmartMarkAsPlayedSecs() { - return Integer.valueOf(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30")); + return Integer.parseInt(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30")); } public static boolean isAutoFlattr() { @@ -260,20 +273,20 @@ public class UserPreferences { public static float getLeftVolume() { int volume = prefs.getInt(PREF_LEFT_VOLUME, 100); - if(volume == 100) { - return 1.0f; - } else { - return (float) (1 - (Math.log(100 - volume) / Math.log(100))); - } + return Converter.getVolumeFromPercentage(volume); } public static float getRightVolume() { int volume = prefs.getInt(PREF_RIGHT_VOLUME, 100); - if(volume == 100) { - return 1.0f; - } else { - return (float) (1 - (Math.log(100 - volume) / Math.log(100))); - } + return Converter.getVolumeFromPercentage(volume); + } + + public static int getLeftVolumePercentage() { + return prefs.getInt(PREF_LEFT_VOLUME, 100); + } + + public static int getRightVolumePercentage() { + return prefs.getInt(PREF_RIGHT_VOLUME, 100); } public static boolean shouldPauseForFocusLoss() { @@ -284,7 +297,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; @@ -295,8 +308,8 @@ public class UserPreferences { String datetime = prefs.getString(PREF_UPDATE_INTERVAL, ""); if(datetime.length() >= 3 && datetime.contains(":")) { String[] parts = datetime.split(":"); - int hourOfDay = Integer.valueOf(parts[0]); - int minute = Integer.valueOf(parts[1]); + int hourOfDay = Integer.parseInt(parts[0]); + int minute = Integer.parseInt(parts[1]); return new int[] { hourOfDay, minute }; } else { return new int[0]; @@ -308,7 +321,7 @@ public class UserPreferences { } public static int getParallelDownloads() { - return Integer.valueOf(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4")); + return Integer.parseInt(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4")); } public static int getEpisodeCacheSizeUnlimited() { @@ -338,12 +351,12 @@ public class UserPreferences { public static int getImageCacheSize() { String cacheSizeString = prefs.getString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE); - int cacheSizeInt = Integer.valueOf(cacheSizeString); + int cacheSizeInt = Integer.parseInt(cacheSizeString); // if the cache size is too small the user won't get any images at all // that's bad, force it back to the default. if (cacheSizeInt < IMAGE_CACHE_SIZE_MINIMUM) { prefs.edit().putString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE).apply(); - cacheSizeInt = Integer.valueOf(IMAGE_CACHE_DEFAULT_VALUE); + cacheSizeInt = Integer.parseInt(IMAGE_CACHE_DEFAULT_VALUE); } int cacheSizeMB = cacheSizeInt * 1024 * 1024; return cacheSizeMB; @@ -371,6 +384,41 @@ public class UserPreferences { return TextUtils.split(selectedNetWorks, ","); } + public static void setProxyConfig(ProxyConfig config) { + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(PREF_PROXY_TYPE, config.type.name()); + if(TextUtils.isEmpty(config.host)) { + editor.remove(PREF_PROXY_HOST); + } else { + editor.putString(PREF_PROXY_HOST, config.host); + } + if(config.port <= 0 || config.port > 65535) { + editor.remove(PREF_PROXY_PORT); + } else { + editor.putInt(PREF_PROXY_PORT, config.port); + } + if(TextUtils.isEmpty(config.username)) { + editor.remove(PREF_PROXY_USER); + } else { + editor.putString(PREF_PROXY_USER, config.username); + } + if(TextUtils.isEmpty(config.password)) { + editor.remove(PREF_PROXY_PASSWORD); + } else { + editor.putString(PREF_PROXY_PASSWORD, config.password); + } + editor.apply(); + } + + public static ProxyConfig getProxyConfig() { + Proxy.Type type = Proxy.Type.valueOf(prefs.getString(PREF_PROXY_TYPE, Proxy.Type.DIRECT.name())); + String host = prefs.getString(PREF_PROXY_HOST, null); + int port = prefs.getInt(PREF_PROXY_PORT, 0); + String username = prefs.getString(PREF_PROXY_USER, null); + String password = prefs.getString(PREF_PROXY_PASSWORD, null); + return new ProxyConfig(type, host, port, username, password); + } + public static boolean shouldResumeAfterCall() { return prefs.getBoolean(PREF_RESUME_AFTER_CALL, true); } @@ -494,7 +542,7 @@ public class UserPreferences { if (valueFromPrefs.equals(context.getString(R.string.pref_episode_cache_unlimited))) { return EPISODE_CACHE_SIZE_UNLIMITED; } else { - return Integer.valueOf(valueFromPrefs); + return Integer.parseInt(valueFromPrefs); } } @@ -502,15 +550,7 @@ public class UserPreferences { String[] selectedSpeeds = null; // If this preference hasn't been set yet, return the default options if (valueFromPrefs == null) { - String[] allSpeeds = context.getResources().getStringArray(R.array.playback_speed_values); - List speedList = new ArrayList<>(); - for (String speedStr : allSpeeds) { - float speed = Float.parseFloat(speedStr); - if (speed < 2.0001 && speed * 10 % 1 == 0) { - speedList.add(speedStr); - } - } - selectedSpeeds = speedList.toArray(new String[speedList.size()]); + selectedSpeeds = new String[] { "1.00", "1.25", "1.50", "1.75", "2.00" }; } else { try { JSONArray jsonArray = new JSONArray(valueFromPrefs); @@ -548,7 +588,7 @@ public class UserPreferences { public static EpisodeCleanupAlgorithm getEpisodeCleanupAlgorithm() { - int cleanupValue = Integer.valueOf(prefs.getString(PREF_EPISODE_CLEANUP, "-1")); + int cleanupValue = Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1")); if (cleanupValue == EPISODE_CLEANUP_QUEUE) { return new APQueueCleanupAlgorithm(); } else if (cleanupValue == EPISODE_CLEANUP_NULL) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java index ce5004a98..33c15883b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java @@ -6,7 +6,7 @@ import android.content.Intent; import android.text.TextUtils; import android.util.Log; -import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.preferences.UserPreferences; /** Listens for events that make it necessary to reset the update alarm. */ @@ -22,8 +22,7 @@ public class AlarmUpdateReceiver extends BroadcastReceiver { } else if (TextUtils.equals(intent.getAction(), Intent.ACTION_PACKAGE_REPLACED)) { Log.d(TAG, "Resetting update alarm after app upgrade"); } - PlaybackPreferences.init(context); - UserPreferences.init(context); + ClientConfig.initialize(context); UserPreferences.restartUpdateAlarm(false); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java index b959c7301..e0abe0efb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java @@ -5,6 +5,7 @@ import android.content.Context; import android.content.Intent; import android.util.Log; +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.NetworkUtils; @@ -19,6 +20,7 @@ public class FeedUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Received intent"); + ClientConfig.initialize(context); if (NetworkUtils.isDownloadAllowed()) { DBTasks.refreshAllFeeds(context, null); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java index a900248d2..51cc52e10 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java +++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java @@ -5,7 +5,8 @@ import android.content.Context; import android.content.Intent; import android.util.Log; import android.view.KeyEvent; -import de.danoeh.antennapod.core.BuildConfig; + +import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.service.playback.PlaybackService; /** Receives media button events. */ @@ -17,10 +18,10 @@ public class MediaButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - if (BuildConfig.DEBUG) Log.d(TAG, "Received intent"); - KeyEvent event = (KeyEvent) intent.getExtras().get( - Intent.EXTRA_KEY_EVENT); + Log.d(TAG, "Received intent"); + KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT); if (event.getAction() == KeyEvent.ACTION_DOWN) { + ClientConfig.initialize(context); Intent serviceIntent = new Intent(context, PlaybackService.class); int keycode = event.getKeyCode(); serviceIntent.putExtra(EXTRA_KEYCODE, keycode); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java index 0b90cef6c..d939c1007 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java @@ -13,7 +13,6 @@ import android.util.Log; import android.util.Pair; import java.util.Collection; -import java.util.Date; import java.util.List; import java.util.Map; @@ -175,7 +174,7 @@ public class GpodnetSyncService extends Service { for (String downloadUrl : changes.getAdded()) { if (false == localSubscriptions.contains(downloadUrl) && false == localRemoved.contains(downloadUrl)) { - Feed feed = new Feed(downloadUrl, new Date(0)); + Feed feed = new Feed(downloadUrl, null); DownloadRequester.getInstance().downloadFeed(this, feed); } } @@ -315,6 +314,7 @@ public class GpodnetSyncService extends Service { .setContentIntent(activityIntent) .setSmallIcon(R.drawable.stat_notify_sync_error) .setAutoCancel(true) + .setVisibility(Notification.VISIBILITY_PUBLIC) .build(); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(id, notification); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java index b23819ef7..5dd1e2dfa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java @@ -2,8 +2,10 @@ package de.danoeh.antennapod.core.service.download; import android.os.Build; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.util.Log; +import com.squareup.okhttp.Credentials; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; @@ -14,7 +16,10 @@ import java.net.CookieManager; import java.net.CookiePolicy; import java.net.HttpURLConnection; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.net.Socket; +import java.net.SocketAddress; import java.net.URL; import java.security.GeneralSecurityException; import java.util.concurrent.TimeUnit; @@ -23,6 +28,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBWriter; /** @@ -44,12 +50,15 @@ public class AntennapodHttpClient { */ public static synchronized OkHttpClient getHttpClient() { if (httpClient == null) { - httpClient = newHttpClient(); } return httpClient; } + public static synchronized void reinit() { + httpClient = newHttpClient(); + } + /** * Creates a new HTTP client. Most users should just use * getHttpClient() to get the standard AntennaPod client, @@ -69,13 +78,13 @@ public class AntennapodHttpClient { client.networkInterceptors().add(chain -> { Request request = chain.request(); Response response = chain.proceed(request); - if(response.code() == HttpURLConnection.HTTP_MOVED_PERM || + if (response.code() == HttpURLConnection.HTTP_MOVED_PERM || response.code() == StatusLine.HTTP_PERM_REDIRECT) { String location = response.header("Location"); - if(location.startsWith("/")) { // URL is not absolute, but relative + if (location.startsWith("/")) { // URL is not absolute, but relative URL url = request.url(); location = url.getProtocol() + "://" + url.getHost() + location; - } else if(!location.toLowerCase().startsWith("http://") && + } else if (!location.toLowerCase().startsWith("http://") && !location.toLowerCase().startsWith("https://")) { // Reference is relative to current path URL url = request.url(); @@ -106,6 +115,21 @@ public class AntennapodHttpClient { client.setFollowRedirects(true); client.setFollowSslRedirects(true); + ProxyConfig config = UserPreferences.getProxyConfig(); + if (config.type != Proxy.Type.DIRECT) { + int port = config.port > 0 ? config.port : ProxyConfig.DEFAULT_PORT; + SocketAddress address = InetSocketAddress.createUnresolved(config.host, port); + Proxy proxy = new Proxy(config.type, address); + client.setProxy(proxy); + if (!TextUtils.isEmpty(config.username)) { + String credentials = Credentials.basic(config.username, config.password); + client.interceptors().add(chain -> { + Request request = chain.request().newBuilder() + .header("Proxy-Authorization", credentials).build(); + return chain.proceed(request); + }); + } + } if(16 <= Build.VERSION.SDK_INT && Build.VERSION.SDK_INT < 21) { client.setSslSocketFactory(new CustomSslSocketFactory()); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java index bc3006eea..de91916a9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import de.danoeh.antennapod.core.feed.FeedFile; import de.danoeh.antennapod.core.util.URLChecker; @@ -15,7 +16,7 @@ public class DownloadRequest implements Parcelable { private final String title; private String username; private String password; - private long ifModifiedSince; + private String lastModified; private boolean deleteOnFailure; private final long feedfileId; private final int feedfileType; @@ -60,7 +61,7 @@ public class DownloadRequest implements Parcelable { this.feedfileType = builder.feedfileType; this.username = builder.username; this.password = builder.password; - this.ifModifiedSince = builder.ifModifiedSince; + this.lastModified = builder.lastModified; this.deleteOnFailure = builder.deleteOnFailure; this.arguments = (builder.arguments != null) ? builder.arguments : new Bundle(); } @@ -71,7 +72,7 @@ public class DownloadRequest implements Parcelable { title = in.readString(); feedfileId = in.readLong(); feedfileType = in.readInt(); - ifModifiedSince = in.readLong(); + lastModified = in.readString(); deleteOnFailure = (in.readByte() > 0); arguments = in.readBundle(); if (in.dataAvail() > 0) { @@ -98,7 +99,7 @@ public class DownloadRequest implements Parcelable { dest.writeString(title); dest.writeLong(feedfileId); dest.writeInt(feedfileType); - dest.writeLong(ifModifiedSince); + dest.writeString(lastModified); dest.writeByte((deleteOnFailure) ? (byte) 1 : 0); dest.writeBundle(arguments); if (username != null) { @@ -127,7 +128,8 @@ public class DownloadRequest implements Parcelable { DownloadRequest that = (DownloadRequest) o; - if (ifModifiedSince != that.ifModifiedSince) return false; + if (lastModified != null ? !lastModified.equals(that.lastModified) : that.lastModified != null) + return false; if (deleteOnFailure != that.deleteOnFailure) return false; if (feedfileId != that.feedfileId) return false; if (feedfileType != that.feedfileType) return false; @@ -143,7 +145,6 @@ public class DownloadRequest implements Parcelable { if (title != null ? !title.equals(that.title) : that.title != null) return false; if (username != null ? !username.equals(that.username) : that.username != null) return false; - return true; } @@ -154,7 +155,7 @@ public class DownloadRequest implements Parcelable { result = 31 * result + (title != null ? title.hashCode() : 0); result = 31 * result + (username != null ? username.hashCode() : 0); result = 31 * result + (password != null ? password.hashCode() : 0); - result = 31 * result + (int)ifModifiedSince; + result = 31 * result + (lastModified != null ? lastModified.hashCode() : 0); result = 31 * result + (deleteOnFailure ? 1 : 0); result = 31 * result + (int) (feedfileId ^ (feedfileId >>> 32)); result = 31 * result + feedfileType; @@ -234,13 +235,14 @@ public class DownloadRequest implements Parcelable { this.password = password; } - public DownloadRequest setIfModifiedSince(long time) { - this.ifModifiedSince = time; + public DownloadRequest setLastModified(@Nullable String lastModified) { + this.lastModified = lastModified; return this; } - public long getIfModifiedSince() { - return this.ifModifiedSince; + @Nullable + public String getLastModified() { + return lastModified; } public boolean isDeleteOnFailure() { @@ -257,7 +259,7 @@ public class DownloadRequest implements Parcelable { private String title; private String username; private String password; - private long ifModifiedSince; + private String lastModified; private boolean deleteOnFailure = false; private long feedfileId; private int feedfileType; @@ -276,8 +278,8 @@ public class DownloadRequest implements Parcelable { return this; } - public Builder ifModifiedSince(long time) { - this.ifModifiedSince = time; + public Builder lastModified(String lastModified) { + this.lastModified = lastModified; return this; } 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 d69228ceb..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; @@ -72,6 +69,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.syndication.handler.FeedHandler; import de.danoeh.antennapod.core.syndication.handler.FeedHandlerResult; import de.danoeh.antennapod.core.syndication.handler.UnsupportedFeedtypeException; +import de.danoeh.antennapod.core.util.ChapterUtils; import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.InvalidFeedException; import de.greenrobot.event.EventBus; @@ -187,7 +185,7 @@ public class DownloadService extends Service { if (status.getReason() == DownloadError.ERROR_UNAUTHORIZED) { postAuthenticationNotification(downloader.getDownloadRequest()); } else if (status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR - && Integer.valueOf(status.getReasonDetailed()) == 416) { + && Integer.parseInt(status.getReasonDetailed()) == 416) { Log.d(TAG, "Requested invalid range, restarting download from the beginning"); FileUtils.deleteQuietly(new File(downloader.getDownloadRequest().getDestination())); @@ -251,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(); @@ -349,7 +328,9 @@ public class DownloadService extends Service { .setOngoing(true) .setContentIntent(ClientConfig.downloadServiceCallbacks.getNotificationContentIntent(this)) .setLargeIcon(icon) - .setSmallIcon(R.drawable.stat_notify_sync); + .setSmallIcon(R.drawable.stat_notify_sync) + .setVisibility(Notification.VISIBILITY_PUBLIC); + Log.d(TAG, "Notification set up"); } @@ -380,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("%)"); } } @@ -486,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(); }); } @@ -555,7 +533,9 @@ public class DownloadService extends Service { .setContentIntent( ClientConfig.downloadServiceCallbacks.getReportNotificationContentIntent(this) ) - .setAutoCancel(true).build(); + .setAutoCancel(true) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .build(); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(REPORT_ID, notification); } else { @@ -569,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); } /** @@ -593,26 +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)); - 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); }); } @@ -645,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; @@ -662,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; @@ -706,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(); } } @@ -745,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(); }); } @@ -824,7 +790,7 @@ public class DownloadService extends Service { } private Pair parseFeed(DownloadRequest request) { - Feed feed = new Feed(request.getSource(), new Date()); + Feed feed = new Feed(request.getSource(), request.getLastModified()); feed.setFile_url(request.getDestination()); feed.setId(request.getFeedfileId()); feed.setDownloaded(true); @@ -841,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; @@ -878,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)); @@ -1011,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(); } } @@ -1046,6 +1000,9 @@ public class DownloadService extends Service { media.setFile_url(request.getDestination()); media.setHasEmbeddedPicture(null); + // check if file has chapters + ChapterUtils.loadChaptersFromFileUrl(media); + // Get duration MediaMetadataRetriever mmr = null; try { @@ -1078,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()); } @@ -1125,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 0b9fba6f7..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 @@ -8,7 +8,6 @@ import com.squareup.okhttp.Protocol; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import com.squareup.okhttp.ResponseBody; -import com.squareup.okhttp.internal.http.HttpDate; import org.apache.commons.io.IOUtils; @@ -22,12 +21,14 @@ 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; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.FeedImage; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.util.DateUtils; import de.danoeh.antennapod.core.util.DownloadError; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.core.util.URIUtil; @@ -67,13 +68,24 @@ public class HttpDownloader extends Downloader { final URI uri = URIUtil.getURIFromRequestUrl(request.getSource()); Request.Builder httpReq = new Request.Builder().url(uri.toURL()) .header("User-Agent", ClientConfig.USER_AGENT); - if(request.getIfModifiedSince() > 0) { - long threeDaysAgo = System.currentTimeMillis() - 1000*60*60*24*3; - if(request.getIfModifiedSince() > threeDaysAgo) { - Date date = new Date(request.getIfModifiedSince()); - String httpDate = HttpDate.format(date); - Log.d(TAG, "addHeader(\"If-Modified-Since\", \"" + httpDate + "\")"); - httpReq.addHeader("If-Modified-Since", httpDate); + if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + // set header explicitly so that okhttp doesn't do transparent gzip + Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")"); + httpReq.addHeader("Accept-Encoding", "identity"); + } + + if(!TextUtils.isEmpty(request.getLastModified())) { + String lastModified = request.getLastModified(); + Date lastModifiedDate = DateUtils.parse(lastModified); + if(lastModifiedDate != null) { + long threeDaysAgo = System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 3; + if (lastModifiedDate.getTime() > threeDaysAgo) { + Log.d(TAG, "addHeader(\"If-Modified-Since\", \"" + lastModified + "\")"); + httpReq.addHeader("If-Modified-Since", lastModified); + } + } else { + Log.d(TAG, "addHeader(\"If-None-Match\", \"" + lastModified + "\")"); + httpReq.addHeader("If-None-Match", lastModified); } } @@ -98,19 +110,28 @@ 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 { throw e; } } + + if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { + String contentType = response.header("Content-Type"); + if(!contentType.startsWith("audio/") && !contentType.startsWith("video/")) { + onFail(DownloadError.ERROR_FILE_TYPE, null); + return; + } + } + responseBody = response.body(); String contentEncodingHeader = response.header("Content-Encoding"); boolean isGzip = false; @@ -174,7 +195,7 @@ public class HttpDownloader extends Downloader { && !TextUtils.isEmpty(contentRangeHeader)) { String start = contentRangeHeader.substring("bytes ".length(), contentRangeHeader.indexOf("-")); - request.setSoFar(Long.valueOf(start)); + request.setSoFar(Long.parseLong(start)); Log.d(TAG, "Starting download at position " + request.getSoFar()); out = new RandomAccessFile(destination, "rw"); @@ -235,6 +256,12 @@ public class HttpDownloader extends Downloader { onFail(DownloadError.ERROR_IO_ERROR, "Download completed, but nothing was read"); return; } + String lastModified = response.header("Last-Modified"); + if(lastModified != null) { + request.setLastModified(lastModified); + } else { + request.setLastModified(response.header("ETag")); + } onSuccess(); } 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 new file mode 100644 index 000000000..6eb1f4118 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java @@ -0,0 +1,32 @@ +package de.danoeh.antennapod.core.service.download; + +import android.support.annotation.Nullable; + +import java.net.Proxy; + +public class ProxyConfig { + + public final Proxy.Type type; + @Nullable public final String host; + public final int port; + @Nullable public final String username; + @Nullable public final String password; + + public final static int DEFAULT_PORT = 8080; + + public static ProxyConfig direct() { + return new ProxyConfig(Proxy.Type.DIRECT, null, 0, null, null); + } + + public static ProxyConfig http(String host, int port, String username, String password) { + return new ProxyConfig(Proxy.Type.HTTP, host, port, username, password); + } + + public ProxyConfig(Proxy.Type type, String host, int port, String username, String password) { + this.type = type; + this.host = host; + this.port = port; + this.username = username; + this.password = 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..729ea9e7a 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 @@ -141,6 +141,11 @@ public class PlaybackService extends Service { */ public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE = 8; + /** + * Ability to set the playback speed has changed + */ + public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9; + /** * Returned by getPositionSafe() or getDurationSafe() if the playbackService * is in an invalid state. @@ -512,8 +517,11 @@ public class PlaybackService extends Service { @Override public void playbackSpeedChanged(float s) { - sendNotificationBroadcast( - NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); + sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0); + } + + public void setSpeedAbilityChanged() { + sendNotificationBroadcast(NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED, 0); } @Override @@ -835,7 +843,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 a82e82506..aa51840a7 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 @@ -25,6 +25,8 @@ import android.view.WindowManager; import com.bumptech.glide.Glide; +import org.antennapod.audio.MediaPlayer; + import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingDeque; @@ -99,7 +101,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 +177,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,24 +257,13 @@ 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(); 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,58 +367,52 @@ 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); - - if (abandonFocus) { - audioManager.abandonAudioFocus(audioFocusChangeListener); - pausedBecauseOfTransientAudiofocusLoss = false; - } - if (stream && reinit) { - reinit(); - } - } else { - Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state"); + 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; } - - playerLock.unlock(); + if (stream && reinit) { + reinit(); + } + } else { + Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state"); } + + playerLock.unlock(); }); } /** - * 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. */ 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 +431,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 +457,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 +521,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 +530,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(); }); } @@ -604,7 +575,11 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre * Returns the position of the current media object or INVALID_TIME if the position could not be retrieved. */ public int getPosition() { - if (!playerLock.tryLock()) { + try { + if (!playerLock.tryLock(50, TimeUnit.MILLISECONDS)) { + return INVALID_TIME; + } + } catch (InterruptedException e) { return INVALID_TIME; } @@ -614,10 +589,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre || playerStatus == PlayerStatus.PREPARED || playerStatus == PlayerStatus.SEEKING) { retVal = mediaPlayer.getCurrentPosition(); - if(retVal <= 0 && media != null && media.getPosition() > 0) { - retVal = media.getPosition(); - } - } else if (media != null && media.getPosition() > 0) { + } + if (retVal <= 0 && media != null && media.getPosition() >= 0) { retVal = media.getPosition(); } @@ -653,7 +626,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); } @@ -666,12 +639,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)); } /** @@ -693,7 +661,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } /** - * Sets the playback speed. + * Sets the playback volume. * This method is executed on an internal executor service. */ public void setVolume(final float volumeLeft, float volumeRight) { @@ -701,7 +669,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre } /** - * Sets the playback speed. + * Sets the playback volume. * This method is executed on the caller's thread. */ private void setVolumeSync(float volumeLeft, float volumeRight) { @@ -757,28 +725,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(); }); } @@ -799,7 +761,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(); @@ -946,15 +908,16 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre if (pausedBecauseOfTransientAudiofocusLoss) { // we paused => play now resume(); } else { // we ducked => raise audio level back - audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, - AudioManager.ADJUST_RAISE, 0); + setVolumeSync(UserPreferences.getLeftVolume(), + UserPreferences.getRightVolume()); } } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { if (playerStatus == PlayerStatus.PLAYING) { if (!UserPreferences.shouldPauseForFocusLoss()) { Log.d(TAG, "Lost audio focus temporarily. Ducking..."); - audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, - AudioManager.ADJUST_LOWER, 0); + final float DUCK_FACTOR = 0.25f; + setVolumeSync(DUCK_FACTOR * UserPreferences.getLeftVolume(), + DUCK_FACTOR * UserPreferences.getRightVolume()); pausedBecauseOfTransientAudiofocusLoss = false; } else { Log.d(TAG, "Lost audio focus temporarily. Could duck, but won't, pausing..."); @@ -1004,20 +967,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(); + }); } @@ -1058,6 +1018,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre void playbackSpeedChanged(float s); + void setSpeedAbilityChanged(); + void onBufferingUpdate(int percent); boolean onMediaPlayerInfo(int code); @@ -1078,6 +1040,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre ((AudioPlayer) mp) .setOnBufferingUpdateListener(audioBufferingUpdateListener); ((AudioPlayer) mp).setOnInfoListener(audioInfoListener); + ((AudioPlayer) mp).setOnSpeedAdjustmentAvailableChangedListener(audioSetSpeedAbilityListener); } else { ((VideoPlayer) mp) .setOnCompletionListener(videoCompletionListener); @@ -1092,100 +1055,68 @@ 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 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 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 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() { + private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener + audioSetSpeedAbilityListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() { @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); - } + public void onSpeedAdjustmentAvailableChanged(MediaPlayer arg0, boolean speedAdjustmentAvailable) { + callback.setSpeedAbilityChanged(); } }; - 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 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 = 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 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) { @@ -1204,6 +1135,71 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre private static final String TAG = "MediaSessionCompat"; + @Override + public void onPlay() { + Log.d(TAG, "onPlay()"); + if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { + resume(); + } else if (playerStatus == PlayerStatus.INITIALIZED) { + setStartWhenPrepared(true); + prepare(); + } + } + + @Override + public void onPause() { + Log.d(TAG, "onPause()"); + if (playerStatus == PlayerStatus.PLAYING) { + pause(false, true); + } + if (UserPreferences.isPersistNotify()) { + pause(false, true); + } else { + pause(true, true); + } + } + + @Override + public void onStop() { + Log.d(TAG, "onStop()"); + stop(); + } + + @Override + public void onSkipToPrevious() { + Log.d(TAG, "onSkipToPrevious()"); + seekDelta(-UserPreferences.getRewindSecs() * 1000); + } + + @Override + public void onRewind() { + Log.d(TAG, "onRewind()"); + seekDelta(-UserPreferences.getRewindSecs() * 1000); + } + + @Override + public void onFastForward() { + Log.d(TAG, "onFastForward()"); + seekDelta(UserPreferences.getFastFowardSecs() * 1000); + } + + @Override + public void onSkipToNext() { + Log.d(TAG, "onSkipToNext()"); + if(UserPreferences.shouldHardwareButtonSkip()) { + endPlayback(true); + } else { + seekDelta(UserPreferences.getFastFowardSecs() * 1000); + } + } + + + @Override + public void onSeekTo(long pos) { + Log.d(TAG, "onSeekTo()"); + seekTo((int) pos); + } + @Override public boolean onMediaButtonEvent(final Intent mediaButton) { Log.d(TAG, "onMediaButtonEvent(" + mediaButton + ")"); @@ -1240,42 +1236,27 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre return true; } case KeyEvent.KEYCODE_MEDIA_PLAY: { - Log.d(TAG, "Received Play event from RemoteControlClient"); - if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { - resume(); - } else if (playerStatus == PlayerStatus.INITIALIZED) { - setStartWhenPrepared(true); - prepare(); - } + sessionCallback.onPlay(); return true; } case KeyEvent.KEYCODE_MEDIA_PAUSE: { - Log.d(TAG, "Received Pause event from RemoteControlClient"); - if (playerStatus == PlayerStatus.PLAYING) { - pause(false, true); - } - if (UserPreferences.isPersistNotify()) { - pause(false, true); - } else { - pause(true, true); - } + sessionCallback.onPause(); return true; } case KeyEvent.KEYCODE_MEDIA_STOP: { - Log.d(TAG, "Received Stop event from RemoteControlClient"); - stop(); + sessionCallback.onStop(); return true; } case KeyEvent.KEYCODE_MEDIA_PREVIOUS: { - seekDelta(-UserPreferences.getRewindSecs() * 1000); + sessionCallback.onSkipToPrevious(); return true; } case KeyEvent.KEYCODE_MEDIA_REWIND: { - seekDelta(-UserPreferences.getRewindSecs() * 1000); + sessionCallback.onRewind(); return true; } case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: { - seekDelta(UserPreferences.getFastFowardSecs() * 1000); + sessionCallback.onFastForward(); return true; } case KeyEvent.KEYCODE_MEDIA_NEXT: { 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 0dc54fb6e..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 @@ -1,6 +1,7 @@ package de.danoeh.antennapod.core.storage; import android.content.Context; +import android.support.annotation.NonNull; import android.util.Log; import java.util.ArrayList; @@ -12,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. @@ -28,30 +27,18 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm { this.numberOfDaysAfterPlayback = numberOfDaysAfterPlayback; } + /** + * @return the number of episodes that *could* be cleaned up, if needed + */ + public int getReclaimableItems() + { + return getCandidates().size(); + } + @Override public int performCleanup(Context context, int numberOfEpisodesToDelete) { - List candidates = new ArrayList<>(); - List downloadedItems = DBReader.getDownloadedItems(); + List candidates = getCandidates(); List delete; - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback); - Date mostRecentDateForDeletion = cal.getTime(); - for (FeedItem item : downloadedItems) { - if (item.hasMedia() - && item.getMedia().isDownloaded() - && !item.isTagged(FeedItem.TAG_QUEUE) - && item.isPlayed() - && !item.isTagged(FeedItem.TAG_FAVORITE)) { - FeedMedia media = item.getMedia(); - // make sure this candidate was played at least the proper amount of days prior - // to now - if (media != null - && media.getPlaybackCompletionDate() != null - && media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) { - candidates.add(item); - } - } - } Collections.sort(candidates, (lhs, rhs) -> { Date l = lhs.getMedia().getPlaybackCompletionDate(); @@ -90,6 +77,32 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm { return counter; } + @NonNull + private List getCandidates() { + List candidates = new ArrayList<>(); + List downloadedItems = DBReader.getDownloadedItems(); + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback); + Date mostRecentDateForDeletion = cal.getTime(); + for (FeedItem item : downloadedItems) { + if (item.hasMedia() + && item.getMedia().isDownloaded() + && !item.isTagged(FeedItem.TAG_QUEUE) + && item.isPlayed() + && !item.isTagged(FeedItem.TAG_FAVORITE)) { + FeedMedia media = item.getMedia(); + // make sure this candidate was played at least the proper amount of days prior + // to now + if (media != null + && media.getPlaybackCompletionDate() != null + && media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) { + candidates.add(item); + } + } + } + return candidates; + } + @Override public int getDefaultCleanupParameter() { return getNumEpisodesToCleanup(0); 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/APNullCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java index 132b61853..9cec62d83 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java @@ -21,4 +21,9 @@ public class APNullCleanupAlgorithm extends EpisodeCleanupAlgorithm { public int getDefaultCleanupParameter() { return 0; } + + @Override + public int getReclaimableItems() { + return 0; + } } 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 234d6162c..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 @@ -1,18 +1,16 @@ package de.danoeh.antennapod.core.storage; import android.content.Context; +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 @@ -22,19 +20,18 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm { private static final String TAG = "APQueueCleanupAlgorithm"; + /** + * @return the number of episodes that *could* be cleaned up, if needed + */ + public int getReclaimableItems() + { + return getCandidates().size(); + } + @Override public int performCleanup(Context context, int numberOfEpisodesToDelete) { - List candidates = new ArrayList<>(); - List downloadedItems = DBReader.getDownloadedItems(); + List candidates = getCandidates(); List delete; - for (FeedItem item : downloadedItems) { - if (item.hasMedia() - && item.getMedia().isDownloaded() - && !item.isTagged(FeedItem.TAG_QUEUE) - && !item.isTagged(FeedItem.TAG_FAVORITE)) { - candidates.add(item); - } - } // in the absence of better data, we'll sort by item publication date Collections.sort(candidates, (lhs, rhs) -> { @@ -74,6 +71,21 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm { return counter; } + @NonNull + private List getCandidates() { + List candidates = new ArrayList<>(); + List downloadedItems = DBReader.getDownloadedItems(); + for (FeedItem item : downloadedItems) { + if (item.hasMedia() + && item.getMedia().isDownloaded() + && !item.isTagged(FeedItem.TAG_QUEUE) + && !item.isTagged(FeedItem.TAG_FAVORITE)) { + candidates.add(item); + } + } + return candidates; + } + @Override public int getDefaultCleanupParameter() { return getNumEpisodesToCleanup(0); 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/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index 0563f878f..94629ba9d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -4,6 +4,7 @@ import android.database.Cursor; import android.support.v4.util.ArrayMap; import android.util.Log; +import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -590,17 +591,19 @@ public final class DBReader { FeedItem item = null; Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId)); - if (itemCursor.moveToFirst()) { - List list = extractItemlistFromCursor(adapter, itemCursor); - if (list.size() > 0) { - item = list.get(0); - loadAdditionalFeedItemListData(list); - if (item.hasChapters()) { - loadChaptersOfFeedItem(adapter, item); - } - } + if (!itemCursor.moveToFirst()) { + itemCursor.close(); + return null; } + List list = extractItemlistFromCursor(adapter, itemCursor); itemCursor.close(); + if (list.size() > 0) { + item = list.get(0); + loadAdditionalFeedItemListData(list); + if (item.hasChapters()) { + loadChaptersOfFeedItem(adapter, item); + } + } return item; } @@ -676,7 +679,7 @@ public final class DBReader { * as well as chapter marks of the FeedItems will also be loaded from the database. */ public static List getFeedItems(final long... itemIds) { - Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + itemIds + "]"); + Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + Arrays.toString(itemIds) + "]"); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); List items = getFeedItems(adapter, itemIds); @@ -898,24 +901,111 @@ public final class DBReader { adapter.open(); Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId); - FeedMedia media = null; - if (mediaCursor.moveToFirst()) { - int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM); - final long itemId = mediaCursor.getLong(indexFeedItem); - media = FeedMedia.fromCursor(mediaCursor); + if (!mediaCursor.moveToFirst()) { + mediaCursor.close(); + return null; + } + + int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM); + long itemId = mediaCursor.getLong(indexFeedItem); + FeedMedia media = FeedMedia.fromCursor(mediaCursor); + mediaCursor.close(); + + if(media != null) { FeedItem item = getFeedItem(itemId); - if (media != null && item != null) { + if (item != null) { media.setItem(item); item.setMedia(media); } } - mediaCursor.close(); adapter.close(); return media; } + /** + * Searches the DB for statistics + * + * @return The StatisticsInfo object + */ + public static StatisticsData getStatistics() { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + + long totalTime = 0; + List feedTime = new ArrayList<>(); + + List feeds = getFeedList(); + for (Feed feed : feeds) { + long feedPlayedTime = 0; + long feedTotalTime = 0; + long episodes = 0; + long episodesStarted = 0; + List items = getFeed(feed.getId()).getItems(); + for(FeedItem item : items) { + FeedMedia media = item.getMedia(); + if(media == null) { + continue; + } + + if(item.isPlayed()) { + feedPlayedTime += media.getDuration() / 1000; + } else { + feedPlayedTime += media.getPosition() / 1000; + } + if(item.isPlayed() || media.getPosition() != 0) { + episodesStarted++; + } + feedTotalTime += media.getDuration() / 1000; + episodes++; + } + feedTime.add(new StatisticsItem( + feed, feedTotalTime, feedPlayedTime, episodes, episodesStarted)); + totalTime += feedPlayedTime; + } + + Collections.sort(feedTime, (item1, item2) -> { + if(item1.timePlayed > item2.timePlayed) { + return -1; + } else if(item1.timePlayed < item2.timePlayed) { + return 1; + } else { + return 0; + } + }); + + adapter.close(); + return new StatisticsData(totalTime, feedTime); + } + + public static class StatisticsData { + public long totalTime; + public List feedTime; + + public StatisticsData(long totalTime, List feedTime) { + this.totalTime = totalTime; + this.feedTime = feedTime; + } + } + + public static class StatisticsItem { + public Feed feed; + public long time; + public long timePlayed; + public long episodes; + public long episodesStarted; + + public StatisticsItem(Feed feed, long time, long timePlayed, + long episodes, long episodesStarted) { + this.feed = feed; + this.time = time; + this.timePlayed = timePlayed; + this.episodes = episodes; + this.episodesStarted = episodesStarted; + } + } + /** * Returns the flattr queue as a List of FlattrThings. The list consists of Feeds and FeedItems. * @@ -1017,7 +1107,8 @@ public final class DBReader { int numNewItems = adapter.getNumberOfNewItems(); int numDownloadedItems = adapter.getNumberOfDownloadedEpisodes(); - NavDrawerData result = new NavDrawerData(feeds, queueSize, numNewItems, numDownloadedItems, feedCounters); + NavDrawerData result = new NavDrawerData(feeds, queueSize, numNewItems, numDownloadedItems, + feedCounters, UserPreferences.getEpisodeCleanupAlgorithm().getReclaimableItems()); adapter.close(); return result; } @@ -1028,17 +1119,20 @@ public final class DBReader { public int numNewItems; public int numDownloadedItems; public LongIntMap feedCounters; + public int reclaimableSpace; public NavDrawerData(List feeds, int queueSize, int numNewItems, int numDownloadedItems, - LongIntMap feedIndicatorValues) { + LongIntMap feedIndicatorValues, + int reclaimableSpace) { this.feeds = feeds; this.queueSize = queueSize; this.numNewItems = numNewItems; this.numDownloadedItems = numDownloadedItems; this.feedCounters = feedIndicatorValues; + this.reclaimableSpace = reclaimableSpace; } } } 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 efc60bfc2..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); @@ -224,7 +219,28 @@ public final class DBTasks { */ public static void refreshCompleteFeed(final Context context, final Feed feed) { try { - refreshFeed(context, feed, true); + refreshFeed(context, feed, true, false); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DBWriter.addDownloadStatus( + new DownloadStatus(feed, feed + .getHumanReadableIdentifier(), + DownloadError.ERROR_REQUEST_ERROR, false, e + .getMessage() + ) + ); + } + } + + /** + * Downloads all pages of the given feed even if feed has not been modified since last refresh + * + * @param context Used for requesting the download. + * @param feed The Feed object. + */ + public static void forceRefreshCompleteFeed(final Context context, final Feed feed) { + try { + refreshFeed(context, feed, true, true); } catch (DownloadRequestException e) { e.printStackTrace(); DBWriter.addDownloadStatus( @@ -248,11 +264,11 @@ public final class DBTasks { public static void loadNextPageOfFeed(final Context context, Feed feed, boolean loadAllPages) throws DownloadRequestException { if (feed.isPaged() && feed.getNextPageLink() != null) { int pageNr = feed.getPageNr() + 1; - Feed nextFeed = new Feed(feed.getNextPageLink(), new Date(), feed.getTitle() + "(" + pageNr + ")"); + Feed nextFeed = new Feed(feed.getNextPageLink(), null, feed.getTitle() + "(" + pageNr + ")"); nextFeed.setPageNr(pageNr); nextFeed.setPaged(true); nextFeed.setId(feed.getId()); - DownloadRequester.getInstance().downloadFeed(context, nextFeed, loadAllPages); + DownloadRequester.getInstance().downloadFeed(context, nextFeed, loadAllPages, false); } else { Log.e(TAG, "loadNextPageOfFeed: Feed was either not paged or contained no nextPageLink"); } @@ -268,12 +284,25 @@ public final class DBTasks { public static void refreshFeed(Context context, Feed feed) throws DownloadRequestException { Log.d(TAG, "refreshFeed(feed.id: " + feed.getId() +")"); - refreshFeed(context, feed, false); + refreshFeed(context, feed, false, false); + } + + /** + * Refresh a specific feed even if feed has not been modified since last refresh + * + * @param context Used for requesting the download. + * @param feed The Feed object. + */ + public static void forceRefreshFeed(Context context, Feed feed) + throws DownloadRequestException { + Log.d(TAG, "refreshFeed(feed.id: " + feed.getId() +")"); + refreshFeed(context, feed, false, true); } - private static void refreshFeed(Context context, Feed feed, boolean loadAllPages) throws DownloadRequestException { + private static void refreshFeed(Context context, Feed feed, boolean loadAllPages, boolean force) + throws DownloadRequestException { Feed f; - Date lastUpdate = feed.hasLastUpdateFailed() ? new Date(0) : feed.getLastUpdate(); + String lastUpdate = feed.hasLastUpdateFailed() ? null : feed.getLastUpdate(); if (feed.getPreferences() == null) { f = new Feed(feed.getDownload_url(), lastUpdate, feed.getTitle()); } else { @@ -281,7 +310,7 @@ public final class DBTasks { feed.getPreferences().getUsername(), feed.getPreferences().getPassword()); } f.setId(feed.getId()); - DownloadRequester.getInstance().downloadFeed(context, f, loadAllPages); + DownloadRequester.getInstance().downloadFeed(context, f, loadAllPages, force); } /** @@ -484,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(); @@ -577,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(); } @@ -599,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, @@ -623,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, @@ -647,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, @@ -670,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 0dc1dadeb..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() { @@ -88,7 +88,7 @@ public class DownloadRequester { private void download(Context context, FeedFile item, FeedFile container, File dest, boolean overwriteIfExists, String username, String password, - long ifModifiedSince, boolean deleteOnFailure, Bundle arguments) { + String lastModified, boolean deleteOnFailure, Bundle arguments) { final boolean partiallyDownloadedFileExists = item.getFile_url() != null; if (isDownloadingFile(item)) { Log.e(TAG, "URL " + item.getDownload_url() @@ -129,7 +129,7 @@ public class DownloadRequester { DownloadRequest.Builder builder = new DownloadRequest.Builder(dest.toString(), item) .withAuthentication(username, password) - .ifModifiedSince(ifModifiedSince) + .lastModified(lastModified) .deleteOnFailure(deleteOnFailure) .withArguments(arguments); DownloadRequest request = builder.build(); @@ -162,24 +162,25 @@ public class DownloadRequester { * @param feed Feed to download * @param loadAllPages Set to true to download all pages */ - public synchronized void downloadFeed(Context context, Feed feed, boolean loadAllPages) + public synchronized void downloadFeed(Context context, Feed feed, boolean loadAllPages, + boolean force) throws DownloadRequestException { if (feedFileValid(feed)) { String username = (feed.getPreferences() != null) ? feed.getPreferences().getUsername() : null; String password = (feed.getPreferences() != null) ? feed.getPreferences().getPassword() : null; - long ifModifiedSince = feed.isPaged() ? 0 : feed.getLastUpdate().getTime(); + String lastModified = feed.isPaged() || force ? null : feed.getLastUpdate(); Bundle args = new Bundle(); args.putInt(REQUEST_ARG_PAGE_NR, feed.getPageNr()); args.putBoolean(REQUEST_ARG_LOAD_ALL_PAGES, loadAllPages); download(context, feed, null, new File(getFeedfilePath(context), - getFeedfileName(feed)), true, username, password, ifModifiedSince, true, args); + getFeedfileName(feed)), true, username, password, lastModified, true, args); } } public synchronized void downloadFeed(Context context, Feed feed) throws DownloadRequestException { - downloadFeed(context, feed, false); + downloadFeed(context, feed, false, false); } public synchronized void downloadMedia(Context context, FeedMedia feedmedia) @@ -204,7 +205,7 @@ public class DownloadRequester { getMediafilename(feedmedia)); } download(context, feedmedia, feed, - dest, false, username, password, 0, false, null); + dest, false, username, password, null, false, null); } } @@ -267,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/EpisodeCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java index 0f402745c..97cbdca33 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java @@ -39,6 +39,11 @@ public abstract class EpisodeCleanupAlgorithm { return performCleanup(context, getNumEpisodesToCleanup(amountOfRoomNeeded)); } + /** + * @return the number of episodes/items that *could* be cleaned up, if needed + */ + public abstract int getReclaimableItems(); + /** * @param amountOfRoomNeeded the number of episodes we want to download * @return the number of episodes to delete in order to make room 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 85ff8fc8c..c8df0f572 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 @@ -10,12 +10,14 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.media.MediaMetadataRetriever; +import android.os.Build; import android.text.TextUtils; import android.util.Log; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.event.ProgressEvent; @@ -303,7 +305,7 @@ public class PodDBAdapter { private static SQLiteDatabase db; private static Context context; private static PodDBHelper dbHelper; - private static int counter = 0; + private static AtomicInteger counter = new AtomicInteger(0); public static void init(Context context) { PodDBAdapter.context = context.getApplicationContext(); @@ -318,11 +320,15 @@ public class PodDBAdapter { private PodDBAdapter() {} - public PodDBAdapter open() { + public synchronized PodDBAdapter open() { + int adapters = counter.incrementAndGet(); + Log.v(TAG, "Opening DB #" + adapters); if (db == null || !db.isOpen() || db.isReadOnly()) { - Log.v(TAG, "Opening DB"); try { db = dbHelper.getWritableDatabase(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.enableWriteAheadLogging(); + } } catch (SQLException ex) { Log.e(TAG, Log.getStackTraceString(ex)); db = dbHelper.getReadableDatabase(); @@ -331,8 +337,13 @@ public class PodDBAdapter { return this; } - public void close() { - // do nothing + public synchronized void close() { + int adapters = counter.decrementAndGet(); + Log.v(TAG, "Closing DB #" + adapters); + if(adapters == 0) { + Log.v(TAG, "Closing DB, really"); + db.close(); + } } public static boolean deleteDatabase() { @@ -368,7 +379,7 @@ public class PodDBAdapter { values.put(KEY_FILE_URL, feed.getFile_url()); values.put(KEY_DOWNLOAD_URL, feed.getDownload_url()); values.put(KEY_DOWNLOADED, feed.isDownloaded()); - values.put(KEY_LASTUPDATE, feed.getLastUpdate().getTime()); + values.put(KEY_LASTUPDATE, feed.getLastUpdate()); values.put(KEY_TYPE, feed.getType()); values.put(KEY_FEED_IDENTIFIER, feed.getFeedIdentifier()); @@ -425,34 +436,46 @@ public class PodDBAdapter { */ public long setImage(FeedImage image) { boolean startedTransaction = false; - if(false == db.inTransaction()) { - db.beginTransaction(); - startedTransaction = true; - } - ContentValues values = new ContentValues(); - values.put(KEY_TITLE, image.getTitle()); - values.put(KEY_DOWNLOAD_URL, image.getDownload_url()); - values.put(KEY_DOWNLOADED, image.isDownloaded()); - values.put(KEY_FILE_URL, image.getFile_url()); - if (image.getId() == 0) { - image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values)); - } else { - db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?", + try { + if (!db.inTransaction()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + startedTransaction = true; + } + + ContentValues values = new ContentValues(); + values.put(KEY_TITLE, image.getTitle()); + values.put(KEY_DOWNLOAD_URL, image.getDownload_url()); + values.put(KEY_DOWNLOADED, image.isDownloaded()); + values.put(KEY_FILE_URL, image.getFile_url()); + if (image.getId() == 0) { + image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values)); + } else { + db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?", new String[]{String.valueOf(image.getId())}); - } + } - final FeedComponent owner = image.getOwner(); - if (owner != null && owner.getId() != 0) { - values.clear(); - values.put(KEY_IMAGE, image.getId()); - if (owner instanceof Feed) { - db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())}); + final FeedComponent owner = image.getOwner(); + if (owner != null && owner.getId() != 0) { + values.clear(); + values.put(KEY_IMAGE, image.getId()); + if (owner instanceof Feed) { + db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())}); + } + } + if (startedTransaction) { + db.setTransactionSuccessful(); + } + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + if (startedTransaction) { + db.endTransaction(); } - } - if(startedTransaction) { - db.setTransactionSuccessful(); - db.endTransaction(); } return image.getId(); } @@ -522,20 +545,29 @@ public class PodDBAdapter { * transaction */ public void setCompleteFeed(Feed... feeds) { - db.beginTransaction(); - for (Feed feed : feeds) { - setFeed(feed); - if (feed.getItems() != null) { - for (FeedItem item : feed.getItems()) { - setFeedItem(item, false); - } + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); } - if (feed.getPreferences() != null) { - setFeedPreferences(feed.getPreferences()); + for (Feed feed : feeds) { + setFeed(feed); + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + setFeedItem(item, false); + } + } + if (feed.getPreferences() != null) { + setFeedPreferences(feed.getPreferences()); + } } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } /** @@ -598,19 +630,38 @@ public class PodDBAdapter { } public void setFeedItemlist(List items) { - db.beginTransaction(); - for (FeedItem item : items) { - setFeedItem(item, true); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + for (FeedItem item : items) { + setFeedItem(item, true); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public long setSingleFeedItem(FeedItem item) { - db.beginTransaction(); - long result = setFeedItem(item, true); - db.setTransactionSuccessful(); - db.endTransaction(); + long result = 0; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + result = setFeedItem(item, true); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } return result; } @@ -728,20 +779,29 @@ public class PodDBAdapter { public void setFeedItemRead(int played, long itemId, long mediaId, boolean resetMediaPosition) { - db.beginTransaction(); - ContentValues values = new ContentValues(); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + ContentValues values = new ContentValues(); - values.put(KEY_READ, played); - db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)}); + values.put(KEY_READ, played); + db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)}); - if (resetMediaPosition) { - values.clear(); - values.put(KEY_POSITION, 0); - db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)}); - } + if (resetMediaPosition) { + values.clear(); + values.put(KEY_POSITION, 0); + db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)}); + } - db.setTransactionSuccessful(); - db.endTransaction(); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } } /** @@ -750,15 +810,24 @@ public class PodDBAdapter { * @param itemIds items to change the value of */ public void setFeedItemRead(int read, long... itemIds) { - db.beginTransaction(); - ContentValues values = new ContentValues(); - for (long id : itemIds) { - values.clear(); - values.put(KEY_READ, read); - db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + ContentValues values = new ContentValues(); + for (long id : itemIds) { + values.clear(); + values.put(KEY_READ, read); + db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)}); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public void setChapters(FeedItem item) { @@ -822,17 +891,26 @@ public class PodDBAdapter { public void setFavorites(List favorites) { ContentValues values = new ContentValues(); - db.beginTransaction(); - db.delete(TABLE_NAME_FAVORITES, null, null); - for (int i = 0; i < favorites.size(); i++) { - FeedItem item = favorites.get(i); - values.put(KEY_ID, i); - values.put(KEY_FEEDITEM, item.getId()); - values.put(KEY_FEED, item.getFeed().getId()); - db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + db.delete(TABLE_NAME_FAVORITES, null, null); + for (int i = 0; i < favorites.size(); i++) { + FeedItem item = favorites.get(i); + values.put(KEY_ID, i); + values.put(KEY_FEEDITEM, item.getId()); + values.put(KEY_FEED, item.getFeed().getId()); + db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } /** @@ -880,17 +958,26 @@ public class PodDBAdapter { public void setQueue(List queue) { ContentValues values = new ContentValues(); - db.beginTransaction(); - db.delete(TABLE_NAME_QUEUE, null, null); - for (int i = 0; i < queue.size(); i++) { - FeedItem item = queue.get(i); - values.put(KEY_ID, i); - values.put(KEY_FEEDITEM, item.getId()); - values.put(KEY_FEED, item.getFeed().getId()); - db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); + } + db.delete(TABLE_NAME_QUEUE, null, null); + for (int i = 0; i < queue.size(); i++) { + FeedItem item = queue.get(i); + values.put(KEY_ID, i); + values.put(KEY_FEEDITEM, item.getId()); + values.put(KEY_FEED, item.getFeed().getId()); + db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); } - db.setTransactionSuccessful(); - db.endTransaction(); } public void clearQueue() { @@ -937,23 +1024,32 @@ public class PodDBAdapter { * Remove a feed with all its FeedItems and Media entries. */ public void removeFeed(Feed feed) { - db.beginTransaction(); - if (feed.getImage() != null) { - removeFeedImage(feed.getImage()); - } - if (feed.getItems() != null) { - for (FeedItem item : feed.getItems()) { - removeFeedItem(item); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + db.beginTransactionNonExclusive(); + } else { + db.beginTransaction(); } - } - // delete download log entries for feed - db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE +"=?", - new String[] { String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED) }); + if (feed.getImage() != null) { + removeFeedImage(feed.getImage()); + } + if (feed.getItems() != null) { + for (FeedItem item : feed.getItems()) { + removeFeedItem(item); + } + } + // delete download log entries for feed + db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?", + new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)}); - db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?", + db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?", new String[]{String.valueOf(feed.getId())}); - db.setTransactionSuccessful(); - db.endTransaction(); + db.setTransactionSuccessful(); + } catch (SQLException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } finally { + db.endTransaction(); + } } public void clearPlaybackHistory() { @@ -972,9 +1068,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 +1087,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 +1109,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 +1156,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 +1187,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 +1203,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 +1211,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 +1225,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); } /** @@ -1151,7 +1234,7 @@ public class PodDBAdapter { * The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection. */ public final Cursor getNewItemsCursor() { - String[] args = new String[] { + Object[] args = new String[] { SEL_FI_SMALL_STR, TABLE_NAME_FEED_ITEMS, TABLE_NAME_FEEDS, @@ -1160,13 +1243,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 +1256,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 +1272,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 +1323,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) { @@ -1512,7 +1590,7 @@ public class PodDBAdapter { */ private static class PodDBHelper extends SQLiteOpenHelper { - private final static int VERSION = 1050003; + private final static int VERSION = 1050004; private Context context; @@ -1756,7 +1834,6 @@ public class PodDBAdapter { db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_PUBDATE); db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_READ); } - if (oldVersion < 1050003) { // Migrates feed list filter data @@ -1804,6 +1881,11 @@ public class PodDBAdapter { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS + " ADD COLUMN " + PodDBAdapter.KEY_KEEP_UPDATED + " INTEGER DEFAULT 1"); } + if (oldVersion < 1050004) { + // prevent old timestamps to be misinterpreted as ETags + db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEEDS + +" SET " + PodDBAdapter.KEY_LASTUPDATE + "=NULL"); + } EventBus.getDefault().post(ProgressEvent.end()); } 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/syndication/namespace/NSContent.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java index 71bf69ffa..306b79c15 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java @@ -1,8 +1,9 @@ package de.danoeh.antennapod.core.syndication.namespace; -import de.danoeh.antennapod.core.syndication.handler.HandlerState; import org.xml.sax.Attributes; +import de.danoeh.antennapod.core.syndication.handler.HandlerState; + public class NSContent extends Namespace { public static final String NSTAG = "content"; public static final String NSURI = "http://purl.org/rss/1.0/modules/content/"; @@ -17,7 +18,8 @@ public class NSContent extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ENCODED)) { + if (ENCODED.equals(localName) && state.getCurrentItem() != null && + state.getContentBuf() != null) { state.getCurrentItem().setContentEncoded(state.getContentBuf().toString()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java index 23f76186b..59d66a97e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java @@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.syndication.namespace; import org.xml.sax.Attributes; +import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.syndication.handler.HandlerState; import de.danoeh.antennapod.core.util.DateUtils; @@ -21,17 +22,16 @@ public class NSDublinCore extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if(state.getTagstack().size() >= 2 - && state.getContentBuf() != null) { - String content = state.getContentBuf().toString(); - SyndElement topElement = state.getTagstack().peek(); - String top = topElement.getName(); - SyndElement secondElement = state.getSecondTag(); - String second = secondElement.getName(); - if (top.equals(DATE) && second.equals(ITEM)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); + if (state.getCurrentItem() != null && state.getContentBuf() != null && + state.getTagstack() != null && state.getTagstack().size() >= 2) { + FeedItem currentItem = state.getCurrentItem(); + String top = state.getTagstack().peek().getName(); + String second = state.getSecondTag().getName(); + if (DATE.equals(top) && ITEM.equals(second)) { + String content = state.getContentBuf().toString(); + currentItem.setPubDate(DateUtils.parse(content)); } } } + } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java index 99c4cd67a..1c424c6b5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.core.syndication.namespace; import android.text.TextUtils; +import android.util.Log; import org.xml.sax.Attributes; @@ -10,6 +11,7 @@ import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.syndication.handler.HandlerState; public class NSITunes extends Namespace { + public static final String NSTAG = "itunes"; public static final String NSURI = "http://www.itunes.com/dtds/podcast-1.0.dtd"; @@ -26,69 +28,82 @@ public class NSITunes extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(IMAGE)) { + if (IMAGE.equals(localName)) { FeedImage image = new FeedImage(); image.setTitle(IMAGE_TITLE); image.setDownload_url(attributes.getValue(IMAGE_HREF)); if (state.getCurrentItem() != null) { // this is an items image - image.setTitle(state.getCurrentItem().getTitle()+IMAGE_TITLE); + image.setTitle(state.getCurrentItem().getTitle() + IMAGE_TITLE); image.setOwner(state.getCurrentItem()); state.getCurrentItem().setImage(image); - - } else { + } else { // this is the feed image // prefer to all other images - if(!TextUtils.isEmpty(image.getDownload_url())) { + if (!TextUtils.isEmpty(image.getDownload_url())) { image.setOwner(state.getFeed()); state.getFeed().setImage(image); } } - } - return new SyndElement(localName, this); } @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(AUTHOR)) { - state.getFeed().setAuthor(state.getContentBuf().toString()); - } else if (localName.equals(DURATION)) { - String[] parts = state.getContentBuf().toString().trim().split(":"); + if(state.getContentBuf() == null) { + return; + } + if (AUTHOR.equals(localName)) { + if (state.getFeed() != null) { + String author = state.getContentBuf().toString(); + state.getFeed().setAuthor(author); + } + } else if (DURATION.equals(localName)) { + String durationStr = state.getContentBuf().toString(); + if(TextUtils.isEmpty(durationStr)) { + return; + } + String[] parts = durationStr.trim().split(":"); try { - int duration = 0; + int durationMs = 0; if (parts.length == 2) { - duration += TimeUnit.MINUTES.toMillis(Long.valueOf(parts[0])) + - TimeUnit.SECONDS.toMillis(Long.valueOf(parts[1])); + durationMs += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) + + TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[1])); } else if (parts.length >= 3) { - duration += TimeUnit.HOURS.toMillis(Long.valueOf(parts[0])) + - TimeUnit.MINUTES.toMillis(Long.valueOf(parts[1])) + - TimeUnit.SECONDS.toMillis(Long.valueOf(parts[2])); + durationMs += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) + + TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) + + TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[2])); } else { return; } - state.getTempObjects().put(DURATION, duration); + state.getTempObjects().put(DURATION, durationMs); } catch (NumberFormatException e) { - e.printStackTrace(); + Log.e(NSTAG, "Duration \"" + durationStr + "\" could not be parsed"); } - } else if (localName.equals(SUBTITLE)) { + } else if (SUBTITLE.equals(localName)) { String subtitle = state.getContentBuf().toString(); + if (TextUtils.isEmpty(subtitle)) { + return; + } if (state.getCurrentItem() != null) { if (TextUtils.isEmpty(state.getCurrentItem().getDescription())) { state.getCurrentItem().setDescription(subtitle); } } else { - if (TextUtils.isEmpty(state.getFeed().getDescription())) { + if (state.getFeed() != null && TextUtils.isEmpty(state.getFeed().getDescription())) { state.getFeed().setDescription(subtitle); } } - } else if (localName.equals(SUMMARY)) { + } else if (SUMMARY.equals(localName)) { String summary = state.getContentBuf().toString(); + if (TextUtils.isEmpty(summary)) { + return; + } if (state.getCurrentItem() != null) { state.getCurrentItem().setDescription(summary); - } else { + } else if (state.getFeed() != null) { state.getFeed().setDescription(summary); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java index 7f03f1139..7a8b2bc03 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java @@ -1,14 +1,16 @@ package de.danoeh.antennapod.core.syndication.namespace; +import android.text.TextUtils; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; -import de.danoeh.antennapod.core.feed.FeedMedia; -import de.danoeh.antennapod.core.syndication.handler.HandlerState; -import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils; + import org.xml.sax.Attributes; import java.util.concurrent.TimeUnit; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.syndication.handler.HandlerState; +import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils; + /** Processes tags from the http://search.yahoo.com/mrss/ namespace. */ public class NSMedia extends Namespace { private static final String TAG = "NSMedia"; @@ -25,36 +27,41 @@ public class NSMedia extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(CONTENT)) { + if (CONTENT.equals(localName)) { String url = attributes.getValue(DOWNLOAD_URL); String type = attributes.getValue(MIME_TYPE); - if (state.getCurrentItem().getMedia() == null - && url != null - && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils - .getValidMimeTypeFromUrl(url)) != null))) { - + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = SyndTypeUtils.getValidMimeTypeFromUrl(url); + validType = type != null; + } + if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && + url != null && validType) { long size = 0; + String sizeStr = attributes.getValue(SIZE); try { - size = Long.parseLong(attributes.getValue(SIZE)); + size = Long.parseLong(sizeStr); } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Length attribute could not be parsed."); + Log.e(TAG, "Size \"" + sizeStr + "\" could not be parsed."); } - - int duration = 0; - try { - String durationStr = attributes.getValue(DURATION); - if (durationStr != null) { - duration = (int) TimeUnit.MILLISECONDS.convert( - Long.parseLong(durationStr), TimeUnit.SECONDS); + + int durationMs = 0; + String durationStr = attributes.getValue(DURATION); + if (!TextUtils.isEmpty(durationStr)) { + try { + long duration = Long.parseLong(durationStr); + durationMs = (int) TimeUnit.MILLISECONDS.convert(duration, TimeUnit.SECONDS); + } catch (NumberFormatException e) { + Log.e(TAG, "Duration \"" + durationStr + "\" could not be parsed"); } - } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Duration attribute could not be parsed"); } - - state.getCurrentItem().setMedia( - new FeedMedia(state.getCurrentItem(), url, size, type)); + FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type); + if(durationMs > 0) { + media.setDuration(durationMs); + } + state.getCurrentItem().setMedia(media); } } return new SyndElement(localName, this); diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java index 7e19213be..1c7952a56 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java @@ -1,10 +1,10 @@ package de.danoeh.antennapod.core.syndication.namespace; +import android.text.TextUtils; import android.util.Log; import org.xml.sax.Attributes; -import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; @@ -43,18 +43,23 @@ public class NSRSS20 extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(ITEM)) { + if (ITEM.equals(localName)) { state.setCurrentItem(new FeedItem()); state.getItems().add(state.getCurrentItem()); state.getCurrentItem().setFeed(state.getFeed()); - } else if (localName.equals(ENCLOSURE)) { + } else if (ENCLOSURE.equals(localName)) { String type = attributes.getValue(ENC_TYPE); String url = attributes.getValue(ENC_URL); - if (state.getCurrentItem().getMedia() == null - && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils - .getValidMimeTypeFromUrl(url)) != null))) { - + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = type = SyndTypeUtils.getValidMimeTypeFromUrl(url); + validType = type != null; + } + if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && + validType) { long size = 0; try { size = Long.parseLong(attributes.getValue(ENC_LEN)); @@ -63,19 +68,18 @@ public class NSRSS20 extends Namespace { size = 0; } } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Length attribute could not be parsed."); + Log.d(TAG, "Length attribute could not be parsed."); } state.getCurrentItem().setMedia( new FeedMedia(state.getCurrentItem(), url, size, type)); } - } else if (localName.equals(IMAGE)) { + } else if (IMAGE.equals(localName)) { if (state.getTagstack().size() >= 1) { String parent = state.getTagstack().peek().getName(); - if (parent.equals(CHANNEL)) { + if (CHANNEL.equals(parent)) { Feed feed = state.getFeed(); - if(feed.getImage() == null) { + if(feed != null && feed.getImage() == null) { feed.setImage(new FeedImage()); feed.getImage().setOwner(state.getFeed()); } @@ -87,26 +91,26 @@ public class NSRSS20 extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ITEM)) { + if (ITEM.equals(localName)) { if (state.getCurrentItem() != null) { + FeedItem currentItem = state.getCurrentItem(); // the title tag is optional in RSS 2.0. The description is used // as a // title if the item has no title-tag. - if (state.getCurrentItem().getTitle() == null) { - state.getCurrentItem().setTitle( - state.getCurrentItem().getDescription()); + if (currentItem.getTitle() == null) { + currentItem.setTitle(currentItem.getDescription()); } if (state.getTempObjects().containsKey(NSITunes.DURATION)) { - if (state.getCurrentItem().hasMedia()) { - state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION)); + if (currentItem.hasMedia()) { + Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION); + currentItem.getMedia().setDuration(duration); } state.getTempObjects().remove(NSITunes.DURATION); } } state.setCurrentItem(null); - } else if (state.getTagstack().size() >= 2 - && state.getContentBuf() != null) { + } else if (state.getTagstack().size() >= 2 && state.getContentBuf() != null) { String content = state.getContentBuf().toString(); SyndElement topElement = state.getTagstack().peek(); String top = topElement.getName(); @@ -116,46 +120,44 @@ public class NSRSS20 extends Namespace { if (state.getTagstack().size() >= 3) { third = state.getThirdTag().getName(); } - - if (top.equals(GUID) && second.equals(ITEM)) { + if (GUID.equals(top) && ITEM.equals(second)) { // some feed creators include an empty or non-standard guid-element in their feed, which should be ignored - if (!content.isEmpty()) { + if (!TextUtils.isEmpty(content) && state.getCurrentItem() != null) { state.getCurrentItem().setItemIdentifier(content); } - } else if (top.equals(TITLE)) { + } else if (TITLE.equals(top)) { String title = content.trim(); - if (second.equals(ITEM)) { + if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setTitle(title); - } else if (second.equals(CHANNEL)) { + } else if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setTitle(title); - } else if (second.equals(IMAGE) && third != null - && third.equals(CHANNEL)) { - if(state.getFeed().getImage().getTitle() == null) { + } else if (IMAGE.equals(second) && CHANNEL.equals(third)) { + if(state.getFeed() != null && state.getFeed().getImage() != null && + state.getFeed().getImage().getTitle() == null) { state.getFeed().getImage().setTitle(title); } } - } else if (top.equals(LINK)) { - if (second.equals(CHANNEL)) { + } else if (LINK.equals(top)) { + if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setLink(content); - } else if (second.equals(ITEM)) { + } else if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setLink(content); } - } else if (top.equals(PUBDATE) && second.equals(ITEM)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } else if (top.equals(URL) && second.equals(IMAGE) && third != null - && third.equals(CHANNEL)) { - if(state.getFeed().getImage().getDownload_url() == null) { // prefer itunes:image + } else if (PUBDATE.equals(top) && ITEM.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (URL.equals(top) && IMAGE.equals(second) && CHANNEL.equals(third)) { + // prefer itunes:image + if(state.getFeed() != null && state.getFeed().getImage() != null && + state.getFeed().getImage().getDownload_url() == null) { state.getFeed().getImage().setDownload_url(content); } - } else if (localName.equals(DESCR)) { - if (second.equals(CHANNEL)) { + } else if (DESCR.equals(localName)) { + if (CHANNEL.equals(second) && state.getFeed() != null) { state.getFeed().setDescription(content); - } else if (second.equals(ITEM)) { + } else if (ITEM.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setDescription(content); } - - } else if (localName.equals(LANGUAGE)) { + } else if (LANGUAGE.equals(localName) && state.getFeed() != null) { state.getFeed().setLanguage(content.toLowerCase()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java index 64b82100e..703817a35 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java @@ -6,8 +6,7 @@ import org.xml.sax.Attributes; import java.util.ArrayList; -import de.danoeh.antennapod.core.BuildConfig; -import de.danoeh.antennapod.core.feed.Chapter; +import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.SimpleChapter; import de.danoeh.antennapod.core.syndication.handler.HandlerState; import de.danoeh.antennapod.core.util.DateUtils; @@ -27,21 +26,22 @@ public class NSSimpleChapters extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(CHAPTERS)) { - state.getCurrentItem().setChapters(new ArrayList()); - } else if (localName.equals(CHAPTER)) { - try { - state.getCurrentItem() - .getChapters() - .add(new SimpleChapter(DateUtils - .parseTimeString(attributes.getValue(START)), - attributes.getValue(TITLE), state.getCurrentItem(), - attributes.getValue(HREF))); - } catch (NumberFormatException e) { - if (BuildConfig.DEBUG) Log.w(TAG, "Unable to read chapter", e); + FeedItem currentItem = state.getCurrentItem(); + if(currentItem != null) { + if (localName.equals(CHAPTERS)) { + currentItem.setChapters(new ArrayList<>()); + } else if (localName.equals(CHAPTER)) { + try { + long start = DateUtils.parseTimeString(attributes.getValue(START)); + String title = attributes.getValue(TITLE); + String link = attributes.getValue(HREF); + SimpleChapter chapter = new SimpleChapter(start, title, currentItem, link); + currentItem.getChapters().add(chapter); + } catch (NumberFormatException e) { + Log.e(TAG, "Unable to read chapter", e); + } } } - return new SyndElement(localName, this); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java index b23a142af..7b5abf053 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.core.syndication.namespace.atom; +import android.text.TextUtils; import android.util.Log; import org.xml.sax.Attributes; @@ -65,21 +66,21 @@ public class NSAtom extends Namespace { @Override public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) { - if (localName.equals(ENTRY)) { + if (ENTRY.equals(localName)) { state.setCurrentItem(new FeedItem()); state.getItems().add(state.getCurrentItem()); state.getCurrentItem().setFeed(state.getFeed()); } else if (localName.matches(isText)) { String type = attributes.getValue(TEXT_TYPE); return new AtomText(localName, this, type); - } else if (localName.equals(LINK)) { + } else if (LINK.equals(localName)) { String href = attributes.getValue(LINK_HREF); String rel = attributes.getValue(LINK_REL); SyndElement parent = state.getTagstack().peek(); if (parent.getName().matches(isFeedItem)) { - if (rel == null || rel.equals(LINK_REL_ALTERNATE)) { + if (LINK_REL_ALTERNATE.equals(rel)) { state.getCurrentItem().setLink(href); - } else if (rel.equals(LINK_REL_ENCLOSURE)) { + } else if (LINK_REL_ENCLOSURE.equals(rel)) { String strSize = attributes.getValue(LINK_LENGTH); long size = 0; try { @@ -90,40 +91,45 @@ public class NSAtom extends Namespace { Log.d(TAG, "Length attribute could not be parsed."); } String type = attributes.getValue(LINK_TYPE); - if (SyndTypeUtils.enclosureTypeValid(type) - || (type = SyndTypeUtils.getValidMimeTypeFromUrl(href)) != null) { + boolean validType; + if(SyndTypeUtils.enclosureTypeValid(type)) { + validType = true; + } else { + type = SyndTypeUtils.getValidMimeTypeFromUrl(href); + validType = type != null; + } + if (validType) { FeedItem currItem = state.getCurrentItem(); - if(!currItem.hasMedia()) { + if(currItem != null && !currItem.hasMedia()) { currItem.setMedia(new FeedMedia(currItem, href, size, type)); } } - } else if (rel.equals(LINK_REL_PAYMENT)) { + } else if (LINK_REL_PAYMENT.equals(rel)) { state.getCurrentItem().setPaymentLink(href); } } else if (parent.getName().matches(isFeed)) { - if (rel == null || rel.equals(LINK_REL_ALTERNATE)) { + if (LINK_REL_ALTERNATE.equals(rel)) { String type = attributes.getValue(LINK_TYPE); /* * Use as link if a) no type-attribute is given and * feed-object has no link yet b) type of link is * LINK_TYPE_HTML or LINK_TYPE_XHTML */ - if ((type == null && state.getFeed().getLink() == null) - || (type != null && (type.equals(LINK_TYPE_HTML) - || type.equals(LINK_TYPE_XHTML)))) { + if (state.getFeed() != null && + ((type == null && state.getFeed().getLink() == null) || + (LINK_TYPE_HTML.equals(type) || LINK_TYPE_XHTML.equals(type)))) { state.getFeed().setLink(href); - } else if (type != null && (type.equals(LINK_TYPE_ATOM) - || type.equals(LINK_TYPE_RSS))) { + } else if (LINK_TYPE_ATOM.equals(type) || LINK_TYPE_RSS.equals(type)) { // treat as podlove alternate feed String title = attributes.getValue(LINK_TITLE); - if (title == null) { + if (TextUtils.isEmpty(title)) { title = href; } state.addAlternateFeedUrl(title, href); } - } else if (rel.equals(LINK_REL_PAYMENT)) { + } else if (LINK_REL_PAYMENT.equals(rel) && state.getFeed() != null) { state.getFeed().setPaymentLink(href); - } else if (rel.equals(LINK_REL_NEXT)) { + } else if (LINK_REL_NEXT.equals(rel) && state.getFeed() != null) { state.getFeed().setPaged(true); state.getFeed().setNextPageLink(href); } @@ -134,11 +140,13 @@ public class NSAtom extends Namespace { @Override public void handleElementEnd(String localName, HandlerState state) { - if (localName.equals(ENTRY)) { + if (ENTRY.equals(localName)) { if (state.getCurrentItem() != null && state.getTempObjects().containsKey(NSITunes.DURATION)) { - if (state.getCurrentItem().hasMedia()) { - state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION)); + FeedItem currentItem = state.getCurrentItem(); + if (currentItem.hasMedia()) { + Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION); + currentItem.getMedia().setDuration(duration); } state.getTempObjects().remove(NSITunes.DURATION); } @@ -163,47 +171,32 @@ public class NSAtom extends Namespace { textElement.setContent(content); } - if (top.equals(ID)) { - if (second.equals(FEED)) { + if (ID.equals(top)) { + if (FEED.equals(second) && state.getFeed() != null) { state.getFeed().setFeedIdentifier(content); - } else if (second.equals(ENTRY)) { + } else if (ENTRY.equals(second) && state.getCurrentItem() != null) { state.getCurrentItem().setItemIdentifier(content); } - } else if (top.equals(TITLE)) { - - if (second.equals(FEED)) { + } else if (TITLE.equals(top) && textElement != null) { + if (FEED.equals(second) && state.getFeed() != null) { state.getFeed().setTitle(textElement.getProcessedContent()); - } else if (second.equals(ENTRY)) { - state.getCurrentItem().setTitle( - textElement.getProcessedContent()); - } - } else if (top.equals(SUBTITLE)) { - if (second.equals(FEED)) { - state.getFeed().setDescription( - textElement.getProcessedContent()); - } - } else if (top.equals(CONTENT)) { - if (second.equals(ENTRY)) { - state.getCurrentItem().setDescription( - textElement.getProcessedContent()); - } - } else if (top.equals(UPDATED)) { - if (second.equals(ENTRY) - && state.getCurrentItem().getPubDate() == null) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } - } else if (top.equals(PUBLISHED)) { - if (second.equals(ENTRY)) { - state.getCurrentItem().setPubDate( - DateUtils.parse(content)); - } - } else if (top.equals(IMAGE)) { - if(state.getFeed().getImage() == null) { - state.getFeed().setImage(new FeedImage(state.getFeed(), content, null)); + } else if (ENTRY.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setTitle(textElement.getProcessedContent()); } + } else if (SUBTITLE.equals(top) && FEED.equals(second) && textElement != null && + state.getFeed() != null) { + state.getFeed().setDescription(textElement.getProcessedContent()); + } else if (CONTENT.equals(top) && ENTRY.equals(second) && textElement != null && + state.getCurrentItem() != null) { + state.getCurrentItem().setDescription(textElement.getProcessedContent()); + } else if (UPDATED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null && + state.getCurrentItem().getPubDate() == null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (PUBLISHED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null) { + state.getCurrentItem().setPubDate(DateUtils.parse(content)); + } else if (IMAGE.equals(top) && state.getFeed() != null && state.getFeed().getImage() == null) { + state.getFeed().setImage(new FeedImage(state.getFeed(), content, null)); } - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java index 8d1d8ffde..e84361fb2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java @@ -30,8 +30,7 @@ public class SyndTypeUtils { if (url != null) { String extension = FilenameUtils.getExtension(url); if (extension != null) { - String type = MimeTypeMap.getSingleton() - .getMimeTypeFromExtension(extension); + String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); if (type != null && enclosureTypeValid(type)) { return type; } 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/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java index 1b929b214..70a180913 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java @@ -3,6 +3,8 @@ package de.danoeh.antennapod.core.util; import android.content.Context; import android.util.Log; +import java.util.Locale; + import de.danoeh.antennapod.core.R; /** Provides methods for converting various units. */ @@ -88,9 +90,9 @@ public final class Converter { if (parts.length != 3) { return 0; } - return Integer.valueOf(parts[0]) * 3600 * 1000 + - Integer.valueOf(parts[1]) * 60 * 1000 + - Integer.valueOf(parts[2]) * 1000; + return Integer.parseInt(parts[0]) * 3600 * 1000 + + Integer.parseInt(parts[1]) * 60 * 1000 + + Integer.parseInt(parts[2]) * 1000; } /** Converts short duration string (HH:MM) to milliseconds. */ @@ -99,8 +101,8 @@ public final class Converter { if (parts.length != 2) { return 0; } - return Integer.valueOf(parts[0]) * 3600 * 1000 + - Integer.valueOf(parts[1]) * 1000 * 60; + return Integer.parseInt(parts[0]) * 3600 * 1000 + + Integer.parseInt(parts[1]) * 1000 * 60; } /** Converts milliseconds to a localized string containing hours and minutes */ @@ -118,5 +120,26 @@ public final class Converter { result += minutes; return result; } - + + /** + * Converts seconds to a localized representation + * @param time The time in seconds + * @return "HH:MM hours" + */ + public static String shortLocalizedDuration(Context context, long time) { + float hours = (float) time / 3600f; + return String.format(Locale.getDefault(), "%.1f ", hours) + context.getString(R.string.time_hours); + } + + /** + * Converts the volume as read as the progress from a SeekBar scaled to 100 and as saved in + * UserPreferences to the format taken by setVolume methods. + * @param progress integer between 0 to 100 taken from the SeekBar progress + * @return the appropriate volume as float taken by setVolume methods + */ + public static float getVolumeFromPercentage(int progress){ + if (progress==100) + return 1f; + return (float) (1 - (Math.log(101 - progress) / Math.log(101))); + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java index 4b4201b50..314062e52 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java @@ -19,14 +19,8 @@ public class DateUtils { private static final String TAG = "DateUtils"; - private static final SimpleDateFormat parser = new SimpleDateFormat("", Locale.US); private static final TimeZone defaultTimezone = TimeZone.getTimeZone("GMT"); - static { - parser.setLenient(false); - parser.setTimeZone(defaultTimezone); - } - public static Date parse(final String input) { if(input == null) { throw new IllegalArgumentException("Date must not be null"); @@ -86,6 +80,10 @@ public class DateUtils { "yyyy-MM-dd" }; + SimpleDateFormat parser = new SimpleDateFormat("", Locale.US); + parser.setLenient(false); + parser.setTimeZone(defaultTimezone); + ParsePosition pos = new ParsePosition(0); for(String pattern : patterns) { parser.applyPattern(pattern); @@ -117,13 +115,13 @@ public class DateUtils { int idx = 0; if (parts.length == 3) { // string has hours - result += Integer.valueOf(parts[idx]) * 3600000L; + result += Integer.parseInt(parts[idx]) * 3600000L; idx++; } if (parts.length >= 2) { - result += Integer.valueOf(parts[idx]) * 60000L; + result += Integer.parseInt(parts[idx]) * 60000L; idx++; - result += (Float.valueOf(parts[idx])) * 1000L; + result += (Float.parseFloat(parts[idx])) * 1000L; } return result; } @@ -145,6 +143,9 @@ public class DateUtils { } public static String formatAbbrev(final Context context, final Date date) { + if(date == null) { + return ""; + } GregorianCalendar cal = new GregorianCalendar(); cal.add(GregorianCalendar.YEAR, -1); // some padding, because no one really remembers what day of the month it is 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 602c221bf..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 @@ -19,12 +19,13 @@ public enum DownloadError { ERROR_UNKNOWN_HOST(11, R.string.download_error_unknown_host), ERROR_REQUEST_ERROR(12, R.string.download_error_request_error), ERROR_DB_ACCESS_ERROR(13, R.string.download_error_db_access), - ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized); + ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized), + ERROR_FILE_TYPE(15, R.string.download_error_file_type_type); 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 673c81235..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 @@ -35,7 +35,7 @@ public final class IntList { int hashCode = 1; for (int i = 0; i < size; i++) { int value = values[i]; - hashCode = 31 * hashCode + (int)(value ^ (value >>> 32)); + hashCode = 31 * hashCode + value; } return hashCode; } @@ -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/flattr/FlattrServiceCreator.java b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java index e4818214e..97958eea7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java @@ -1,11 +1,13 @@ package de.danoeh.antennapod.core.util.flattr; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; + import org.shredzone.flattr4j.FlattrFactory; import org.shredzone.flattr4j.FlattrService; import org.shredzone.flattr4j.oauth.AccessToken; +import de.danoeh.antennapod.core.BuildConfig; + /** Ensures that only one instance of the FlattrService class exists at a time */ public class FlattrServiceCreator { @@ -13,11 +15,14 @@ public class FlattrServiceCreator { private static volatile FlattrService flattrService; - public static FlattrService getService(AccessToken token) { - return FlattrFactory.getInstance().createFlattrService(token); + public synchronized static FlattrService getService(AccessToken token) { + if (flattrService == null) { + flattrService = FlattrFactory.getInstance().createFlattrService(token); + } + return flattrService; } - public static void deleteFlattrService() { + public synchronized static void deleteFlattrService() { if (BuildConfig.DEBUG) Log.d(TAG, "Deleting service instance"); flattrService = null; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java deleted file mode 100644 index 17581d3e9..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java +++ /dev/null @@ -1,55 +0,0 @@ -package de.danoeh.antennapod.core.util.gui; - -import android.os.Parcel; -import android.os.Parcelable; -import de.danoeh.antennapod.core.feed.FeedItem; - -/** - * Used by an UndoBarController for saving a removed FeedItem - */ -public class FeedItemUndoToken implements Parcelable { - private long itemId; - private long feedId; - private int position; - - public FeedItemUndoToken(FeedItem item, int position) { - this.itemId = item.getId(); - this.feedId = item.getFeed().getId(); - this.position = position; - } - - private FeedItemUndoToken(Parcel in) { - itemId = in.readLong(); - feedId = in.readLong(); - position = in.readInt(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public FeedItemUndoToken createFromParcel(Parcel in) { - return new FeedItemUndoToken(in); - } - - public FeedItemUndoToken[] newArray(int size) { - return new FeedItemUndoToken[size]; - } - }; - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel out, int flags) { - out.writeLong(itemId); - out.writeLong(feedId); - out.writeInt(position); - } - - public long getFeedItemId() { - return itemId; - } - - public int getPosition() { - return position; - } -} - 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/AudioPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java index f0850e6df..846733882 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java @@ -1,8 +1,11 @@ package de.danoeh.antennapod.core.util.playback; import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.util.Log; import android.view.SurfaceHolder; + import org.antennapod.audio.MediaPlayer; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -12,8 +15,17 @@ public class AudioPlayer extends MediaPlayer implements IPlayer { public AudioPlayer(Context context) { super(context); + PreferenceManager.getDefaultSharedPreferences(context) + .registerOnSharedPreferenceChangeListener(sonicListener); } + private final SharedPreferences.OnSharedPreferenceChangeListener sonicListener = + (sharedPreferences, key) -> { + if (key.equals(UserPreferences.PREF_SONIC)) { + checkMpi(); + } + }; + @Override public void setScreenOnWhilePlaying(boolean screenOn) { Log.e(TAG, "Setting screen on while playing not supported in Audio Player"); 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 27935978c..1409ffe09 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 @@ -10,7 +10,6 @@ import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.media.MediaPlayer; -import android.os.AsyncTask; import android.os.Build; import android.os.IBinder; import android.preference.PreferenceManager; @@ -19,7 +18,6 @@ import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.view.SurfaceHolder; -import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; @@ -42,6 +40,10 @@ import de.danoeh.antennapod.core.service.playback.PlayerStatus; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.playback.Playable.PlayableUtils; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Communicates with the playback service. GUI classes should use this class to @@ -51,28 +53,30 @@ public abstract class PlaybackController { private static final String TAG = "PlaybackController"; - public static final int INVALID_TIME = -1; + private static final int INVALID_TIME = -1; private final Activity activity; private PlaybackService playbackService; - protected Playable media; + private Playable media; private PlayerStatus status; - private ScheduledThreadPoolExecutor schedExecutor; + private final ScheduledThreadPoolExecutor schedExecutor; private static final int SCHED_EX_POOLSIZE = 1; - protected MediaPositionObserver positionObserver; - protected ScheduledFuture positionObserverFuture; + private MediaPositionObserver positionObserver; + private ScheduledFuture positionObserverFuture; private boolean mediaInfoLoaded = false; private boolean released = false; + private Subscription serviceBinder; + /** * True if controller should reinit playback service if 'pause' button is * pressed. */ - private boolean reinitOnPause; + private final boolean reinitOnPause; public PlaybackController(@NonNull Activity activity, boolean reinitOnPause) { @@ -87,8 +91,7 @@ public abstract class PlaybackController { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - Log.w(TAG, - "Rejected execution of runnable in schedExecutor"); + Log.w(TAG, "Rejected execution of runnable in schedExecutor"); } } ); @@ -111,8 +114,7 @@ public abstract class PlaybackController { if (!released) { bindToService(); } else { - throw new IllegalStateException( - "Can't call init() after release() has been called"); + throw new IllegalStateException("Can't call init() after release() has been called"); } checkMediaInfoLoaded(); } @@ -136,6 +138,9 @@ public abstract class PlaybackController { // ignore } + if(serviceBinder != null) { + serviceBinder.unsubscribe(); + } try { activity.unbindService(mConnection); } catch (IllegalArgumentException e) { @@ -168,34 +173,33 @@ public abstract class PlaybackController { */ private void bindToService() { Log.d(TAG, "Trying to connect to service"); - AsyncTask intentLoader = new AsyncTask() { - @Override - protected Intent doInBackground(Void... voids) { - return getPlayLastPlayedMediaIntent(); - } - - @Override - protected void onPostExecute(Intent serviceIntent) { - boolean bound = false; - if (!PlaybackService.started) { - if (serviceIntent != null) { - Log.d(TAG, "Calling start service"); - activity.startService(serviceIntent); - bound = activity.bindService(serviceIntent, mConnection, 0); + if(serviceBinder != null) { + serviceBinder.unsubscribe(); + } + serviceBinder = Observable.fromCallable(() -> getPlayLastPlayedMediaIntent()) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(intent -> { + boolean bound = false; + if (!PlaybackService.started) { + if (intent != null) { + Log.d(TAG, "Calling start service"); + activity.startService(intent); + bound = activity.bindService(intent, mConnection, 0); + } else { + status = PlayerStatus.STOPPED; + setupGUI(); + handleStatus(); + } } else { - status = PlayerStatus.STOPPED; - setupGUI(); - handleStatus(); + Log.d(TAG, "PlaybackService is running, trying to connect without start command."); + bound = activity.bindService(new Intent(activity, PlaybackService.class), + mConnection, 0); } - } else { - Log.d(TAG, "PlaybackService is running, trying to connect without start command."); - bound = activity.bindService(new Intent(activity, - PlaybackService.class), mConnection, 0); - } - Log.d(TAG, "Result for service binding: " + bound); - } - }; - intentLoader.execute(); + Log.d(TAG, "Result for service binding: " + bound); + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } /** @@ -204,27 +208,21 @@ public abstract class PlaybackController { */ private Intent getPlayLastPlayedMediaIntent() { Log.d(TAG, "Trying to restore last played media"); - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(activity.getApplicationContext()); - long currentlyPlayingMedia = PlaybackPreferences - .getCurrentlyPlayingMedia(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( + activity.getApplicationContext()); + long currentlyPlayingMedia = PlaybackPreferences.getCurrentlyPlayingMedia(); if (currentlyPlayingMedia != PlaybackPreferences.NO_MEDIA_PLAYING) { Playable media = PlayableUtils.createInstanceFromPreferences(activity, (int) currentlyPlayingMedia, prefs); if (media != null) { - Intent serviceIntent = new Intent(activity, - PlaybackService.class); + Intent serviceIntent = new Intent(activity, PlaybackService.class); serviceIntent.putExtra(PlaybackService.EXTRA_PLAYABLE, media); - serviceIntent.putExtra( - PlaybackService.EXTRA_START_WHEN_PREPARED, false); - serviceIntent.putExtra( - PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false); + serviceIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED, false); + serviceIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false); boolean fileExists = media.localFileAvailable(); - boolean lastIsStream = PlaybackPreferences - .getCurrentEpisodeIsStream(); + boolean lastIsStream = PlaybackPreferences.getCurrentEpisodeIsStream(); if (!fileExists && !lastIsStream && media instanceof FeedMedia) { - DBTasks.notifyMissingFeedMediaFile( - activity, (FeedMedia) media); + DBTasks.notifyMissingFeedMediaFile(activity, (FeedMedia) media); } serviceIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM, lastIsStream || !fileExists); @@ -238,10 +236,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(); @@ -259,7 +256,7 @@ public abstract class PlaybackController { } } - private ServiceConnection mConnection = new ServiceConnection() { + private final ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { playbackService = ((PlaybackService.LocalBinder) service) .getService(); @@ -267,7 +264,8 @@ public abstract class PlaybackController { queryService(); Log.d(TAG, "Connection to Service established"); } else { - Log.i(TAG, "Connection to playback service has been established, but controller has already been released"); + Log.i(TAG, "Connection to playback service has been established, " + + "but controller has already been released"); } } @@ -278,7 +276,7 @@ public abstract class PlaybackController { } }; - protected BroadcastReceiver statusUpdate = new BroadcastReceiver() { + private final BroadcastReceiver statusUpdate = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "Received statusUpdate Intent."); @@ -288,66 +286,64 @@ public abstract class PlaybackController { media = info.playable; handleStatus(); } else { - Log.w(TAG, - "Couldn't receive status update: playbackService was null"); + Log.w(TAG, "Couldn't receive status update: playbackService was null"); bindToService(); } } }; - protected BroadcastReceiver notificationReceiver = new BroadcastReceiver() { + private final BroadcastReceiver notificationReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (isConnectedToPlaybackService()) { - int type = intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_TYPE, -1); - int code = intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_CODE, -1); - if (code != -1 && type != -1) { - switch (type) { - case PlaybackService.NOTIFICATION_TYPE_ERROR: - handleError(code); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE: - float progress = ((float) code) / 100; - onBufferUpdate(progress); - break; - case PlaybackService.NOTIFICATION_TYPE_RELOAD: - cancelPositionObserver(); - mediaInfoLoaded = false; - queryService(); - onReloadNotification(intent.getIntExtra( - PlaybackService.EXTRA_NOTIFICATION_CODE, -1)); - break; - case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE: - onSleepTimerUpdate(); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_START: - onBufferStart(); - break; - case PlaybackService.NOTIFICATION_TYPE_BUFFER_END: - onBufferEnd(); - break; - case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END: - onPlaybackEnd(); - break; - case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: - onPlaybackSpeedChange(); - break; - } - - } else { - Log.d(TAG, "Bad arguments. Won't handle intent"); - } - } else { + if (!isConnectedToPlaybackService()) { bindToService(); + return; + } + int type = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_TYPE, -1); + int code = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_CODE, -1); + if(code == -1 || type == -1) { + Log.d(TAG, "Bad arguments. Won't handle intent"); + return; + } + switch (type) { + case PlaybackService.NOTIFICATION_TYPE_ERROR: + handleError(code); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE: + float progress = ((float) code) / 100; + onBufferUpdate(progress); + break; + case PlaybackService.NOTIFICATION_TYPE_RELOAD: + cancelPositionObserver(); + mediaInfoLoaded = false; + queryService(); + onReloadNotification(intent.getIntExtra( + PlaybackService.EXTRA_NOTIFICATION_CODE, -1)); + break; + case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE: + onSleepTimerUpdate(); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_START: + onBufferStart(); + break; + case PlaybackService.NOTIFICATION_TYPE_BUFFER_END: + onBufferEnd(); + break; + case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END: + onPlaybackEnd(); + break; + case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE: + onPlaybackSpeedChange(); + break; + case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED: + onSetSpeedAbilityChanged(); } } }; - private BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { + private final BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -361,31 +357,33 @@ 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 onSetSpeedAbilityChanged() {} + + 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) { @@ -424,6 +422,7 @@ public abstract class PlaybackController { clearStatusMsg(); checkMediaInfoLoaded(); cancelPositionObserver(); + onPositionObserverUpdate(); updatePlayButtonAppearance(playResource, playText); if (PlaybackService.getCurrentMediaType() == MediaType.VIDEO) { setScreenOn(false); @@ -484,23 +483,23 @@ 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 * information has to be refreshed */ - void queryService() { + private void queryService() { Log.d(TAG, "Querying service info"); if (playbackService != null) { status = playbackService.getStatus(); @@ -528,7 +527,7 @@ public abstract class PlaybackController { } } - public void onServiceQueried() {}; + public void onServiceQueried() {} /** * Should be used by classes which implement the OnSeekBarChanged interface. @@ -574,34 +573,32 @@ public abstract class PlaybackController { } - public OnClickListener newOnPlayButtonClickListener() { - return v -> { - if (playbackService == null) { - Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!"); - return; - } - switch (status) { - case PLAYING: - playbackService.pause(true, reinitOnPause); - break; - case PAUSED: - case PREPARED: - playbackService.resume(); - break; - case PREPARING: - playbackService.setStartWhenPrepared(!playbackService - .isStartWhenPrepared()); - if (reinitOnPause - && playbackService.isStartWhenPrepared() == false) { - playbackService.reinit(); - } - break; - case INITIALIZED: - playbackService.setStartWhenPrepared(true); - playbackService.prepare(); - break; - } - }; + public void playPause() { + if (playbackService == null) { + Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!"); + return; + } + switch (status) { + case PLAYING: + playbackService.pause(true, reinitOnPause); + break; + case PAUSED: + case PREPARED: + playbackService.resume(); + break; + case PREPARING: + playbackService.setStartWhenPrepared(!playbackService + .isStartWhenPrepared()); + if (reinitOnPause + && !playbackService.isStartWhenPrepared()) { + playbackService.reinit(); + } + break; + case INITIALIZED: + playbackService.setStartWhenPrepared(true); + playbackService.prepare(); + break; + } } public boolean serviceAvailable() { @@ -679,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) { @@ -718,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() { @@ -737,7 +729,7 @@ public abstract class PlaybackController { * Returns true if PlaybackController can communicate with the playback * service. */ - public boolean isConnectedToPlaybackService() { + private boolean isConnectedToPlaybackService() { return playbackService != null; } @@ -753,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(); } } @@ -770,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 2eee1ac87..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 @@ -2,7 +2,10 @@ package de.danoeh.antennapod.core.util.playback; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.Color; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; +import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; @@ -14,6 +17,7 @@ import org.jsoup.select.Elements; import java.util.regex.Matcher; import java.util.regex.Pattern; +import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.ShownotesProvider; @@ -32,33 +36,39 @@ public class Timeline { private ShownotesProvider shownotesProvider; - - private final String colorString; + private final String noShownotesLabel; + private final String colorPrimaryString; + private final String colorSecondaryString; private final int pageMargin; public Timeline(Context context, ShownotesProvider shownotesProvider) { if (shownotesProvider == null) throw new IllegalArgumentException("shownotesProvider = null"); this.shownotesProvider = shownotesProvider; - TypedArray res = context - .getTheme() - .obtainStyledAttributes( - new int[]{android.R.attr.textColorPrimary}); - int colorResource = res.getColor(0, 0); - colorString = String.format("#%06X", - 0xFFFFFF & colorResource); + noShownotesLabel = context.getString(R.string.no_shownotes_label); + + TypedArray res = context.getTheme().obtainStyledAttributes( + new int[]{ android.R.attr.textColorPrimary}); + @ColorInt int col = res.getColor(0, 0); + colorPrimaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," + + Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")"; + res.recycle(); + res = context.getTheme().obtainStyledAttributes( + new int[]{android.R.attr.textColorSecondary}); + col = res.getColor(0, 0); + colorSecondaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," + + Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")"; res.recycle(); - pageMargin = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, 8, context.getResources() - .getDisplayMetrics() + pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, + context.getResources().getDisplayMetrics() ); } 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("
"); /** @@ -82,9 +92,24 @@ public class Timeline { e.printStackTrace(); return null; } - if (shownotes == null) { - Log.d(TAG, "shownotesProvider contained no shownotes. Returning empty string"); - return ""; + + if(TextUtils.isEmpty(shownotes)) { + Log.d(TAG, "shownotesProvider contained no shownotes. Returning 'no shownotes' message"); + shownotes ="" + + "" + + "" + + "" + + "" + + "

" + noShownotesLabel + "

" + + "" + + ""; + Log.d(TAG, "shownotes: " + shownotes); + return shownotes; } // replace ASCII line breaks with HTML ones if shownotes don't contain HTML line breaks already @@ -95,7 +120,7 @@ public class Timeline { Document document = Jsoup.parse(shownotes); // apply style - String styleStr = String.format(WEBVIEW_STYLE, colorString, "100%", pageMargin, + String styleStr = String.format(WEBVIEW_STYLE, colorPrimaryString, "100%", pageMargin, pageMargin, pageMargin, pageMargin); document.head().appendElement("style").attr("type", "text/css").text(styleStr); @@ -125,8 +150,7 @@ public class Timeline { element.html(buffer.toString()); } } - - Log.i(TAG, "Out: " + document.toString()); + return document.toString(); } @@ -148,7 +172,7 @@ public class Timeline { try { if (m.find()) { - return Integer.valueOf(m.group(1)); + return Integer.parseInt(m.group(1)); } } catch (NumberFormatException e) { e.printStackTrace(); 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 diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png index 37d73c734..af99f4b3b 100644 Binary files a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png index ad148cc6b..398dffa4b 100755 Binary files a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png index 492c8f880..69efaccd1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png index 481643ecd..023e5d21a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png index a32968a19..43783fbce 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png index 6f9df0934..115f7ebef 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png index bddb0b024..392c87bd2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png index e39de4dcf..41052af65 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png index 1f4fd985f..6a2ca5023 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png index 794b7b780..9698d4b7d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png index e4e833242..187a426a8 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png index 4f1a804b3..076773bca 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png index 6dbf83c58..ecaf0d5be 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png index d3f636f13..5ce64cc5f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png new file mode 100644 index 000000000..75c703ae4 Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png new file mode 100644 index 000000000..e6ae7f36b Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png index b72a9f3c6..501e60fa0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png index a9eac0ca7..4d8ce49e3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png deleted file mode 100644 index dd7d0734d..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png deleted file mode 100644 index 93aa3032a..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png index 6e42e1359..72eea4a8d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png index f42a0e2d2..9b4047a41 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png index f2d9906c6..a0b47594b 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png index a2a91938d..a4ce8fa7e 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png index 0f0ddf717..96ed70a40 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png index 724eb1f7a..f3c628e77 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png index 4d1c1d4ae..df9e662c1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png index deeff701f..59ae40266 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png index 03a54ee75..2d61b31f1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png index 60e3decf6..e5ae251d3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png index 9866ee629..f661ca723 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png index 8b9bfd34b..d36891a8d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png index b4f526e62..ab8b48ec3 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png index 5d9d35f70..75796d7a9 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png index d1ad6629d..c09c73441 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png index 9ff662fca..43183d393 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png index c2222fb8e..62caf8392 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png index 46aeab458..8300268dc 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png index 83c564377..0d2f6ccb4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png index e3517a57d..ea6f9078e 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png index 294523814..2452cfa92 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png index 11114b568..96a06141a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png index f87403fa5..f02be50e2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png index b2b1332e1..a0756f264 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png index 62dd8ef48..e56fbf224 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png index 5bb43b464..dccf44930 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png index 713a9ba9a..754299c4a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png index f4b88742d..61ca3fee4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_launcher.png b/core/src/main/res/drawable-hdpi/ic_launcher.png index 994b763cc..8bd22b54a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_launcher.png and b/core/src/main/res/drawable-hdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png index 2aee6f902..11c973d3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png index 436113d27..4f1e57ec1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png index b6dba1002..3e52fd88d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png index 5c60ab08a..2260411cb 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png index a99e9f2b6..a42417431 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png index 61c623ce2..7bde52e12 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index e141502a6..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index fdc4a5ad2..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_new.png b/core/src/main/res/drawable-hdpi/ic_new.png deleted file mode 100755 index 8ff519052..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_dark.png b/core/src/main/res/drawable-hdpi/ic_new_dark.png deleted file mode 100755 index c8581e01c..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png index 7a08c4138..2aa5de2ad 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png index 0d08f329c..8f109572b 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png index 711e0cf94..7281f37e1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png index 5e884dfe8..dde9bb25c 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png index b4bdbb558..1701f34b0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png index da17d12ba..1d024393a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png index 264416933..b540e4a63 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png index 8af4c6cd6..a12b921e4 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png index 164385d04..f77ad6b57 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png index 0cd5cb61a..2b8e3513f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png index 51cc4dbd1..ec8ac3041 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png index cd16fdd50..db069b266 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png index c4df13afa..4f1af39ab 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png index fdf524010..abc338d51 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png new file mode 100644 index 000000000..26a39bec9 Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png new file mode 100644 index 000000000..751e0e360 Binary files /dev/null and b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png index ba65a135b..022f081e0 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png index a2fc5b2e7..cc6d5da86 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png index 20d2b66e0..a7c216d3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png index 9c0172ad0..f8f215236 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png index 9b5a9fb47..eb2611f95 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png index f9a8915fd..14c7da0c2 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png index 987e9b86c..9457cac52 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png index 93b3c219c..80c24d993 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png index edbc95b05..6e1dffc93 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png index cbfb262d8..760ec9987 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png index 809066499..f25063071 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png index 4496a320d..0db6381ea 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png index 79684ab65..c614c2b3d 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png index f0df6032c..5d8072149 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png index 0a52de9fe..715dea65f 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png index 26014a542..9cdac3582 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png index 006410bc3..6b5bc858a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png index 27831192f..d59bc4792 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png index 93f70a024..e4fe7f43a 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png index e8619b780..394c5a60c 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png index 36d502492..fb15f7ee1 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png index c6b5efd33..f40820ef7 100755 Binary files a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index a5fdd2c40..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png deleted file mode 100644 index 864291fa7..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index e299eb41b..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png deleted file mode 100644 index bfdc05d9e..000000000 Binary files a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png index 1942f3f12..57c236892 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png index 952404cbc..410ef41e9 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-hdpi/ic_widget_preview.png b/core/src/main/res/drawable-hdpi/ic_widget_preview.png index 8b583b285..85a537154 100644 Binary files a/core/src/main/res/drawable-hdpi/ic_widget_preview.png and b/core/src/main/res/drawable-hdpi/ic_widget_preview.png differ diff --git a/core/src/main/res/drawable-hdpi/navigation_up.png b/core/src/main/res/drawable-hdpi/navigation_up.png index a2cf2ba52..370092e7e 100755 Binary files a/core/src/main/res/drawable-hdpi/navigation_up.png and b/core/src/main/res/drawable-hdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-hdpi/navigation_up_dark.png b/core/src/main/res/drawable-hdpi/navigation_up_dark.png index f2374a323..2b520c553 100755 Binary files a/core/src/main/res/drawable-hdpi/navigation_up_dark.png and b/core/src/main/res/drawable-hdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync.png b/core/src/main/res/drawable-hdpi/stat_notify_sync.png index ca6c68e4e..f70373d50 100644 Binary files a/core/src/main/res/drawable-hdpi/stat_notify_sync.png and b/core/src/main/res/drawable-hdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png index 84f19cd4e..222e9e8b1 100644 Binary files a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png index e44f42510..ddf545c0b 100644 Binary files a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-ldpi/ic_launcher.png b/core/src/main/res/drawable-ldpi/ic_launcher.png index 546090dd2..494468020 100644 Binary files a/core/src/main/res/drawable-ldpi/ic_launcher.png and b/core/src/main/res/drawable-ldpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png index 63d72970d..501dfa848 100644 Binary files a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png index 8808dedc7..41fd20655 100644 Binary files a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png index de69b17c0..550b56b33 100755 Binary files a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png index 07858bc09..27e311f39 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png index 977dd3427..3856041d7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png index 69b81c10d..0bf060d89 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png index 08c523d48..1e71c271f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png index 27738aacb..d305f0c69 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png index 5355abfd6..99ac9f3c9 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png index a7a30cc24..e91e2cbf6 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png index df332ef3c..c433d9ba0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png index a6bdce736..d5bdfa433 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png index cd90223d1..aefe5b6c1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png index 8a014bda1..a3a588c64 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png index 0811a3493..dc94cdbf4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png new file mode 100644 index 000000000..45c0c29bf Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png new file mode 100644 index 000000000..02167a9f0 Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png index e757fdb07..3bf363a2b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png index e4ea52ef2..6b44a07da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png deleted file mode 100644 index ac18b5750..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png deleted file mode 100644 index f5612717f..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png index 9f860915d..73f72da71 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png index e91f9048b..e094dee36 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png index 0d8277204..7cd66845b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png index 15d016e89..3d1fd0fe3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png index 00b9f645c..4d8cd8e99 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png index 6c2476660..682bcf79f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png index c2864a726..c67fc25f1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png index 4d1c1d4ae..df9e662c1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png index 215099f9e..fceffcb7b 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png index 03a54ee75..2d61b31f1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png index 75adfc97e..de04575da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png index 9866ee629..f661ca723 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png index a050e1bb8..bfb476b4a 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png index b4f526e62..ab8b48ec3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png index 3932b6eef..8037c315e 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png index 9c2a1eb6e..026cac8f2 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png index b3ef8ce73..74d554774 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png index e089466de..b09c53c86 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png index e1e55d72b..b78e7d4d2 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png index 7d72e7562..59a2ec755 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png index df26536f9..ea44e3f07 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png index 0771a106d..78e98fe8d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png index 0a62d358f..397972f67 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png index b93da1006..bcc729de0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png index 52812c42f..0e6ce58e3 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png index 20a9fe5d7..c496b4648 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png index 2537c5f42..b5c14a369 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png index 34f980085..6dbeeb0b7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_launcher.png b/core/src/main/res/drawable-mdpi/ic_launcher.png index 403dfabc4..219e8c5ab 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_launcher.png and b/core/src/main/res/drawable-mdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png index c5c2fc195..ac5b3bed4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png index 5e51ed478..15d8fc2bb 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png index f1627ce34..f9415627e 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png index 8f18d11e6..1203a4406 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png index ada8d3be4..192e27ccd 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png index 72d01c406..232b4bfb4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 4ed34354b..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 1d8ad18a0..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_new.png b/core/src/main/res/drawable-mdpi/ic_new.png deleted file mode 100755 index 84994bd10..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_dark.png b/core/src/main/res/drawable-mdpi/ic_new_dark.png deleted file mode 100755 index b723618b4..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png index 494781a20..4b3ffdbdc 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png index 36e3262a4..c5bb20f49 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png index 06abcb50b..126ee03ef 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png index 711e0cf94..7281f37e1 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png index 026f38854..2272d478c 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png index b4bdbb558..1701f34b0 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png index 4ff5decb0..9c8f2c555 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png index 264416933..b540e4a63 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png index 8d1e433a5..172c211ab 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png index 164385d04..f77ad6b57 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png index c136c59fc..0e927f106 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png index 235c84f1e..79b5ec871 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png index 9e840f03e..daa8e568e 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png index 0bcba825f..a6b4ff0da 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png new file mode 100644 index 000000000..26977a920 Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png new file mode 100644 index 000000000..4aeb2e668 Binary files /dev/null and b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png index 29954062c..c386dbb38 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png index dff1e3a8a..faefc59c8 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png index 8995d0f43..dafbeca33 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png index c31fa8309..ccf89acea 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png index ee0248838..42eb539de 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png index 4d0197223..9d2ef6655 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png index be0fcc765..229eeca47 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png index 893cf2c64..9032328d4 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png index ea511bf2a..df84861b9 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png index 7f631ad86..463b87d2f 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png index 795e318e3..942e7f380 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png index 4304a6bca..9f37b124d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png index f527d0094..dc393caf7 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png index e28dd4592..3d84a4442 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png index dd9d11ba0..8b5275b11 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png index 104fb3c9d..edfd7d71d 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png index af84b71f2..246b43279 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png index 0ccebc7c8..c79334c61 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png index 8b1206b51..152239888 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png index cadfb9643..7fab11a83 100755 Binary files a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index 186887c30..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png deleted file mode 100644 index 735ed7a00..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index 23bec7945..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png deleted file mode 100644 index dc03b34b9..000000000 Binary files a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png index cdbce22a7..c620bc4dd 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png index 3602c4c48..f59e16fa9 100644 Binary files a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-mdpi/navigation_up.png b/core/src/main/res/drawable-mdpi/navigation_up.png index 1ee248a79..520e11da6 100755 Binary files a/core/src/main/res/drawable-mdpi/navigation_up.png and b/core/src/main/res/drawable-mdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-mdpi/navigation_up_dark.png b/core/src/main/res/drawable-mdpi/navigation_up_dark.png index 8ef44cbac..e53627915 100755 Binary files a/core/src/main/res/drawable-mdpi/navigation_up_dark.png and b/core/src/main/res/drawable-mdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync.png b/core/src/main/res/drawable-mdpi/stat_notify_sync.png index 516b65bd9..02066f847 100644 Binary files a/core/src/main/res/drawable-mdpi/stat_notify_sync.png and b/core/src/main/res/drawable-mdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png index c3ed306cf..d797f59c3 100644 Binary files a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png index 59de64c87..30431ed6a 100644 Binary files a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png and b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png index f58fb21df..e83cbc333 100755 Binary files a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png and b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png index 0d8af34b9..19ed567e9 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png index 67042105d..67bb598e5 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png index ed34e22a1..270dc9bf8 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png index 3288241e7..2e0b8ff6f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png index db7b695e9..990ae524a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png index 3dc7bf5cb..d94a40811 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png index ce0da2222..2ad1ac3f5 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png index e9e9c7a53..e8836a1b0 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png index f7c205dd2..e46ab71b4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png index ea2ff8671..bb15a903a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png index a615ee436..336682497 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png index 946cfea57..cdb4a3181 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png new file mode 100644 index 000000000..bb16eabce Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png new file mode 100644 index 000000000..ae5448d24 Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png index c6bb43e8b..5ad22d0f1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png index cdb230c2f..63f990408 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png deleted file mode 100644 index 50f854ea5..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png deleted file mode 100644 index 60d988dd4..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png index 36ed24eec..3f78a47a3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png index e5024472a..5567661ac 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png index 8f335e274..83cb91561 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png index ae9972926..4b030e169 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png index 921249fb2..8e697365f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png index f00aa8bd4..16b7c081e 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png index 6c26d6ea2..6f8b42221 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png index 169a3b386..521f7490b 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png index b7c86059b..2b34fb82d 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png index 8aec1abb0..2d9a7e3c9 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png index d1db46a23..9468020b7 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png index ccac2c273..ea5493251 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png index 379435f54..f4182f174 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png index 857a1aaa2..de9ec1d90 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png index 995aafb5c..84554ce5b 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png index 1495c4fa6..339113c20 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png index aa89d4977..0d42f1749 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png index 990dfb82b..219f47167 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png index fdbb8eb4e..4c6a96eba 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png index 7e14f7fbf..9416c70ec 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png index a0c760e6f..d014684e1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png index 1b8722a7f..91adb4437 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png index a098d8d0f..c0ffea719 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png index 7681ac8b8..3aa40c305 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png index e67d41cc1..3b0d3aa1a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png index 48e52d596..57e478e9f 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png index 9dcb234fe..57f3ec5e3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png index bee33abb7..e18df93a1 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_launcher.png b/core/src/main/res/drawable-xhdpi/ic_launcher.png index 857a1b12e..2dbfd8874 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_launcher.png and b/core/src/main/res/drawable-xhdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png index c51f8a258..030263ce3 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png index abefc200a..2b7253975 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png index ca35f6d0a..c6f6fa06c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png index 01fb55ca1..873687188 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png index 11d9a4b8b..d82d4bd8b 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png index 01ca4b56c..a5ed62d8a 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 7bc63a511..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 1b04eda04..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new.png b/core/src/main/res/drawable-xhdpi/ic_new.png deleted file mode 100755 index 447a9398b..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_dark.png b/core/src/main/res/drawable-xhdpi/ic_new_dark.png deleted file mode 100755 index 4a23d309c..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png index 655658557..a2bb4d1b8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png index 00a4daa62..e78b002f2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png index 3ec598cfd..6708b4161 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png index 7efc88511..aeb13ebc4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png index 14b6d17d4..f49aed757 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png index 72dfa9fa6..7192ad487 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png index 689fda259..6874b8236 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png index ba62a8102..dabd252ee 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png index a55d19922..5b0110454 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png index 043acd808..fff3e1f56 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png index 7891efffa..b2f5463a8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png index 5f89fc257..3dffcc846 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png index 7047ed7ea..2039d9ce8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png index ef2023b52..6dd240bca 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png new file mode 100644 index 000000000..57162f5ca Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png new file mode 100644 index 000000000..ced6247ca Binary files /dev/null and b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png index f9c0b2ec3..b0999b31d 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png index 043759acd..ee844ccdd 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png index 2251d2bbb..5a70fdb99 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png index c30f31017..49813c945 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png index ea2313395..bac1560a2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png index 12e5d100d..d0cf80051 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png index 88a0edd6c..e856dca31 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png index dd536bca2..82692971c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png index 2e291dd19..31aa09ca2 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png index fa85f1899..e664f607c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png index ae0787a26..2d8cb9a75 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png index 026224c5e..6ba86245c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png index ef39d7279..b03fb39b4 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png index 07e156172..4d03cc0dc 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png index f2ef499ef..91447dc4c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png index 68b0b7ad3..6d4af1bcb 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png index 5160319b5..2bd46b7e7 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png index 33f9727d3..4eaf8b891 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png index 7a09ebc33..30f1e6ae6 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png index 288799f93..93d3b5d0c 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png index 50d73271d..3d8a046a8 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png and b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png index 4adfb636c..200b60c96 100755 Binary files a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index 23149552f..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png deleted file mode 100644 index 896d9dcf2..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index 57a60ed9f..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png deleted file mode 100644 index aa7ee9c02..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png b/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png deleted file mode 100644 index 91c8429ad..000000000 Binary files a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png index a9f5ebc33..38150f680 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png index edc590a0b..cce57ef59 100644 Binary files a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-xhdpi/navigation_up.png b/core/src/main/res/drawable-xhdpi/navigation_up.png index f8c3e6f75..0f954094e 100755 Binary files a/core/src/main/res/drawable-xhdpi/navigation_up.png and b/core/src/main/res/drawable-xhdpi/navigation_up.png differ diff --git a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png index 6964e069b..539222b2f 100755 Binary files a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png and b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png differ diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png index ab02927fb..d7348168d 100644 Binary files a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png and b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png index c1f483f71..78c5df4d9 100644 Binary files a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xhdpi/undobar.9.png b/core/src/main/res/drawable-xhdpi/undobar.9.png deleted file mode 100644 index 22fa2205b..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png deleted file mode 100644 index d284ca7cb..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png deleted file mode 100644 index e990659f0..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png b/core/src/main/res/drawable-xhdpi/undobar_divider.9.png deleted file mode 100644 index 1b067d4e7..000000000 Binary files a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png index 70e4e86e7..396d18bca 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png index 72cedcad4..0fdced8fc 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png index f90617f45..3b55c5d55 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png index 48e28102a..76cc4db32 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png index b5918c0f1..eebf0110c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png index 81709e0ae..38a5fc264 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png index f6f7844de..3d2aba75b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png index faa409f80..5bb0c3cc4 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png index 5e52fa65e..7093f28d5 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png index 9c8615618..050e6cd6c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png index 565a755f3..56d380575 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png index 7b1d9ea34..ba9af5265 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png new file mode 100644 index 000000000..23fa54d28 Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png new file mode 100644 index 000000000..d8391d37c Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png index 4886ab1e9..1a3a6192b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png index 0e95e9b1d..e4a5d0261 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png deleted file mode 100644 index 33df5d9d2..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png deleted file mode 100644 index aa5e73299..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png index c836c5490..7feeca3a1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png index f801e7ab3..edb552b49 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png index 88a800f24..dc8682716 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png and b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png index 148891e6c..808186aa9 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png and b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png index 503678f1b..07bb07a38 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png index 16094f9bc..fe5c3d280 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png index 169a3b386..521f7490b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png index 7b83df521..644645c8b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png index 8aec1abb0..2d9a7e3c9 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png index b4cf934f7..76c94c3ba 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png index ccac2c273..ea5493251 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png index 940b5413d..831fda2ab 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png index 857a1aaa2..de9ec1d90 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png index 751e5d1ba..8e11ac89e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png index ddfe32b53..62decef68 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png index 4929a6a11..7838ab87c 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png index e61a48a4d..82b0d1986 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png index 95502de3f..0b479dba2 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png index 43ec90ea5..5846ad140 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png index d3923efee..1263ae82e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png index 111ed802c..19456de04 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png index 417b39b81..82de8bb65 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png index 632a73e42..f083e0f2c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png index 3e438ec4e..17d6d29b8 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png index c2300b53b..2e7d39a5a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png index 66a710d8c..ec4981f5c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png index 64445284b..874226124 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png index 185d18d1a..8a1b185ff 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_launcher.png b/core/src/main/res/drawable-xxhdpi/ic_launcher.png index 2bef52ec7..41b261b4f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_launcher.png and b/core/src/main/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png index ceaf36811..c92e250b8 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png index 6b7e78f83..4d2807e4e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png index 311a7fa13..386595f99 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png index 39a163843..7bc7c690d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png index c0552d564..a424f4c5d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png index 46852d54f..d37d40dcb 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png deleted file mode 100644 index 44012b87d..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png deleted file mode 100644 index 2955c02ec..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new.png b/core/src/main/res/drawable-xxhdpi/ic_new.png deleted file mode 100755 index 5e836eae4..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png b/core/src/main/res/drawable-xxhdpi/ic_new_dark.png deleted file mode 100755 index bca96b751..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png index 3eccc24f0..79507d800 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png index 4a7083c57..a4dbba8ae 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png index 7efc88511..aeb13ebc4 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png index c8ed1d00a..8753d9c50 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png index 72dfa9fa6..7192ad487 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png index 76833ff7d..fb63ddc5a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png index ba62a8102..dabd252ee 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png index 1d44f8f2f..9fcf99558 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png index 043acd808..fff3e1f56 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png index fe7ea25cc..9b31e2d19 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png index 9c1e27d74..e5eef5d8a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png index 72128fe69..13157817d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png index 259ddcd14..16cdc31c1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png index ece7aeb74..695eb950e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png and b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png new file mode 100644 index 000000000..597f417d5 Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png new file mode 100644 index 000000000..2ef908e26 Binary files /dev/null and b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png index 9424ae98e..2cac5b19c 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png index 0bbeab150..0ada3a39f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png index 6a70402b4..fe7d1a24d 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png index 5404820db..37ce4c61a 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png index 19752dd44..0609c3154 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png index 6bb8f6e08..e5de22411 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png index 89136d7c3..97a334744 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png index 9963c6a05..406bc9ab5 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png index 00a55a0f8..75a4a9545 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png index ac38e6d42..a31299c81 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png index f4bd9e94d..8346240f1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png index 6c42d6051..07748be06 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png index b8e06f9b3..8e2e80e71 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png index e2249c357..33770dbb1 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png index 6cdc649ea..fa8c4c593 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png index 56ea13fe2..b8ef1050e 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png index 6348e1997..06f24ef24 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png index aab4831ff..70785a1e3 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png index ef0294931..29fff7d5f 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png index de4b7b29d..d5d478096 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png index b274bb60f..965fabc57 100755 Binary files a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png and b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png deleted file mode 100644 index a9ae43327..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png deleted file mode 100644 index 276f4e1b9..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png deleted file mode 100644 index bb35c5657..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png deleted file mode 100644 index fdbb3ac3a..000000000 Binary files a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png and /dev/null differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png index 9e70743e8..abb58b77b 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png index fcc2d1aca..abf5662b3 100644 Binary files a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png and b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png index 9cd2a53b4..dabb1ea27 100644 Binary files a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png and b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png differ diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png index bb76c2756..6810a8249 100644 Binary files a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png and b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png index c9b68abf0..1c915d9dd 100755 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png index 87b0756eb..190bb0f4c 100755 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png new file mode 100644 index 000000000..448ca4898 Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png new file mode 100644 index 000000000..56a47309c Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png index 5d14b5b25..3fe8eb4dd 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png index e8b865e4a..cb2207f11 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png index e41d5b9ee..03ccfd0d6 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png index 2376b7334..2586be5ab 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png index c281784dd..e46b956e0 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png index 25ea3ab99..b2dd88c07 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png new file mode 100644 index 000000000..25d26d523 Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png new file mode 100644 index 000000000..505fb28dc Binary files /dev/null and b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png index 94836e0c8..b599c2207 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png index a84f34228..a0dd670c3 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png index 9c0116c60..e8348b7e4 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png index e8141d0df..c06456421 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png index ca41ad5e6..5cf1d4f3b 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png index 29782e155..3e9984bf0 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png index 1109e95c8..d79dfa577 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png index 086cb677c..c2d2ee285 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png index dda3262ed..2866aff29 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png differ diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png index ba29292b0..a74fee378 100644 Binary files a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png and b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png differ diff --git a/core/src/main/res/drawable/undobar_button.xml b/core/src/main/res/drawable/undobar_button.xml deleted file mode 100644 index a4de91b49..000000000 --- a/core/src/main/res/drawable/undobar_button.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml new file mode 100644 index 000000000..912f104b0 --- /dev/null +++ b/core/src/main/res/values-ar/strings.xml @@ -0,0 +1,128 @@ + + + + AntennaPod + الكل + المفضلات + جديد + قائمة انتظار + اعدادات + تنزيل + جارى التشغيل + اكتمل + سجل + الغاء التنزيل + + تم نشره مؤخرا + + قائمة الفتح + قائمة الاغلاف + ترتيب بالعداد + ترتيب بالابجدية + ترتيب بتاريخ النشر + الاعداد الجديدة + الاعداد غير المقرؤة + + افتح فى المتصفح + انسخ رابط الموقع + انشر رابط الموقع + تم نسخ الرابط للحافظة + اذهب لهذا الموقع + + + تأكيد + الغاء + نعم + لا + المؤلف + لغة + عنوان الموقع + اعدادات + صورة + خطاء + حدث خطاء + تحديث + لا توجد ذاكرة خارجية متاحة. فضلا تاكد من اتاحة الذاكرة الخارجية للتطبيق حتى يعمل بصورة جيدة + فصول + وصف + جارى المعالجة + جارى التحميل .... + حفظ اسم وكلمة المرور + اغلاق + اعادة المحاولة + تضمين فى التنزيل التلقائي + عام + دائما + ابدا + ارسال ... + ابدا + بعد الانتهاء + + + تعليمه ك تم تشغيله + تعليمه ك تم مشاهدته + اظهار المعلومات + مشاركة + مشاركة الرابط + تطبيق الاجراء + لم يتم تشغيله + ايقاف مؤقت + تم التنزيل + لم يتم التنزيل + + تشغيل + ايقاف مؤقت + ايقاف + مسح + تم تعليمه ك مشغل + تعليمه ك لم يتم تشغيله + اضافة للمفضلات + تم اضافته للمفضلات + المسح من المفضلات + تم مسحه من المفضلات + زيارة الموقع + تنزيل الكل + تفعيل التنزيل التلقائي + ايقاف التنزيل التلقائي + تم حزف العنصر + + نجحت العملية + فشلت العملية + التنزيل فى الانتظار + جارى التنزيل + حهاز التخزين غير موجود + مساحة غير كافية + خطاء فى الملف + خطاء فى بيانات HTTP + خطاء غير معروف + خطاء فى الاتصال + المضيف غير معروف + خطاء فى التحقق + + خطاء غير معروف + + تم حزف العنصر + + + + + + + + + + + + + + الاعداد غير المقرؤة + + + + الكل + لم يتم تشغيله + تم التنزيل + لم يتم التنزيل + + + diff --git a/core/src/main/res/values-ca-rES/strings.xml b/core/src/main/res/values-ca-rES/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-ca-rES/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml index 290c16176..1821eeab7 100644 --- a/core/src/main/res/values-ca/strings.xml +++ b/core/src/main/res/values-ca/strings.xml @@ -22,6 +22,9 @@ Historial de reproducció gpodder.net Inici de sessió a gpodder.net + %1$s lliures + Caché d\'episodi completa + S\'ha arribat al límit de la caché. Pots incrementar la capacitat de la caché a les Opcions Publicats recentment Mostra només els episodis nous @@ -66,6 +69,7 @@ Durada:\u0020 Mida:\u0020 S\'està processant + Carregant... Desa nom d\'usuari i contrasenya Tanca Reintenta @@ -77,6 +81,7 @@ Global Sempre Mai + Enviar... Mai Quan no està a la cua Després d\'acabar @@ -99,6 +104,7 @@ Marca tot com a llegit Mostra informació Esborra podcast + Compartir... Comparteix l\'enllaç Comparteix enllaç amb posició Comparteix adreça del canal @@ -133,7 +139,9 @@ Afegit a la cua Suprimeix de la cua Afegit a Favorits + Afegit a favorits Suprimeix de Favorits + Tret de favorits Visita el lloc web Comparteix amb Flattr Posa-ho tot a la cua @@ -167,6 +175,10 @@ Error d\'E/S Error de petició Error d\'accés a la base de dades + + %d baixada pendent + %d baixades pendents + S\'estan processant les baixades S\'estan baixant les dades del podcast %1$d baixades finalitzades, %2$d fallides @@ -198,6 +210,8 @@ Bloqueja la cua Desbloqueja la cua + Cua bloquejada + Cua no bloquejada Buida la cua Desfés Ítem esborrat @@ -239,11 +253,13 @@ Baixa el connector Connector no instal·lat + Per a què funcioni la velocitat de reproducció variable, recomanem activar el Sonic Media Player integrat [Android 4.1+].\n\nPer una altra banda, pots baixar el plugin de tercers Prestissimo de la Play Store.\nQualsevol problema amb Prestissimo no és responsabilitat d\'AntennaPod i no haurà de ser reportat al seu propietari. Velocitats de reproducció Activa Sonic No hi ha elements a la llista. No us heu subscrit a cap canal. + Aquest episodi no té capítols Altres Quant a @@ -251,12 +267,19 @@ Serveis Flattr Neteja l\'episodi + Episodis que no es troben a la cua i no són favorits haurien de ser candidats per ser esborrats si Auto Descàrrega necessita espai per nous episodis + Pausa la reproducció en desconnectar els auriculars o el bluetooth Continua la reproducció en connectar novament els auriculars + Continua la reproducció en connectar novament el bluetooth + Botó \'Endavant\' passa al següent + Al prémer el botó de hardware \'Endavant\' passar al següent episodi en comptes d\'avançar a la reproducció Salta al següent element de la cua en acabar la reproducció Suprimeix l\'episodi quan s\'acabi de reproduir Esborrat automàtic Marca episodis com com reproduits, encara que quedi menys d\'una certa quantitat de segons de temps Marcació intel·ligent com a reproduit + Mantenir episodis quan són passats de llarg + Mantenir els episodis passats de llarg Reproducció Xarxa Actualitza interval o horari del dia @@ -265,11 +288,14 @@ Desactivar Establir interval Establir hora del dia + cada %1$s + als %1$s Només baixa fitxers a través d\'una xarxa sense fils Reproducció continuada Baixa a través de xarxes sense fils Desconnexió d\'auriculars Connexió d\'auriculars + Connexió de bluetooth Actualitzacions sobre xarxes mòbils Permet actualitzacions a través de xarxes mòbils. S\'està actualitzant @@ -333,8 +359,13 @@ Desactivar Mida de la memòria cau de les imatges Mida de la memòria cau en el disc de les imatges. + Reportar tancament abrupte + Enviar l\'últim report de tancament abrupte per e-mail + Envia e-mail Experimental Reproductor multimèdia Sonic + Fer servir el reproductor Sonic Media integrat en comptes del reproductor natiu d\'Android i Prestissimo + Valor actual: %1$s Activa la compartició automàtica per Flattr Comparteix per Flattr l\'episodi en haver-ne reproduït el %d per cent @@ -361,12 +392,15 @@ El directori d\'importacions és buit. Selecciona-ho tot Deselecciona-ho tot + Selecciona... Des de sistema d\'arxius local Utilitza aplicació externa Exportació OPML + Exportant... Error d\'exportació S\'ha exportat l\'OPML correctament. El fitxer OPML s\'ha escrit a:\u0020 + Per llegir arxius OPML és necessari accés a la memòria externa Defineix un temporitzador Desactiva el temporitzador @@ -424,11 +458,15 @@ Carpeta seleccionada: Crea una carpeta Selecció de la carpeta de dades + Selecciona l\'arrel del teu directori d\'informació. AntennaPod crearà els subdirectoris pertinents Voleu crear una nova carpeta amb el nom \"%1$s\"? S\'ha creat la nova carpeta No es pot escriure dins d\'aquesta carpeta La carpeta ja existeix No s\'ha pogut crear la carpeta + \"%1$s\" no existeix + \"%1$s\" no es pot llegir + No es pot escriure a \"%1$s\" La carpeta no és buida La carpeta que heu seleccionat no és buida. Les baixades i altres fitxers es copiaran directament a aquesta carpeta. Voleu continuar? Selecciona la carpeta per defecte @@ -440,6 +478,7 @@ Subscriu Subscrit + S\'està baixant... Mostra els capítols Mostra les notes del programa @@ -462,11 +501,20 @@ Autenticació Canvieu el nom d\'usuari i contrasenya per a aquest podcast i els seus episodis. + Opcions d\'Auto Descàrrega + Filtre d\'episodis + Llistat de termes usats per decidir si un episodi s\'ha d\'incloure o excloure en descarregar automàticament + Incloure + Excloure + Una paraula \n\"Diverses paraules\" + Mantenir actualitzat Actualització de la base de dades S\'estan important les subscripcions des de les apps de propòsit únic... Cerca a iTunes + Selecciona... + Filtrar Tot Selecciona tots els episodis Cap @@ -479,6 +527,11 @@ Selecciona episodis descarregats No baixat Selecciona episodis sense descarregar + En cua + Episodis en cua seleccionats + No a la cua + Episodis seleccionats i no a la cua + Ordena per... Títol (A \u2192 Z) Títol (Z \u2192 A) Data (Nou \u2192 Antic) @@ -486,5 +539,18 @@ Duració (Curt \u2192 Llarg) Duration (Llarg \u2192 Curt) + T\'agrada AntennaPod? + Apreciaríem que et prenguessis un temps per valorar AntennaPod + Deixa\'m tranquil + Pregunta\'m més tard + I tant, fem-ho! + Controls d\'audio + Velocitat de reproducció + Volum + E + D + Efectes de so + Downmix: D\'estereo a mono + Només Sonic diff --git a/core/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml index 335232675..390fff60b 100644 --- a/core/src/main/res/values-cs-rCZ/strings.xml +++ b/core/src/main/res/values-cs-rCZ/strings.xml @@ -403,6 +403,7 @@ Chyba exportu OPML export byl úspěšný. OPML soubor byl zapsán do:\u0020 + Pro přečtení OPML souboru je vyžadován přístup k externímu úložišti Nastavit časovač vypnutí Deaktivovat časovač vypnutí @@ -464,6 +465,7 @@ Vytvořit adresář Vybrat umístění dat Vyberte prosím váš výchozí datový adresář. AntennaPod vytvoří všechny potřebné podadresáře. + Ke změně datového adresáře je vyžadován přístup k externímu úložišti Vytvořit adresář \"%1$s\"? Nový adresář vytvořen Nelze zapisovat do adresáře @@ -506,6 +508,13 @@ Ověření Změnit uživatelské jméno a heslo pro tento podcast a jeho epizody. + Nastavení automatického stahování + Filtr epizod + Seznam pravidel použitých při rozhodování, jestli má být epizoda zahrnuta nebo vyřazena při automatickém stahování + Zahrnout + Vyřadit + Jednoslovné \n\"Víceslovné\" + Udržovat aktuální Probíhá aktualizace databáze @@ -525,6 +534,10 @@ Vybrány stažené epizody Nestažené Vybrány nestažené epizody + Ve frontě + Vybrané epizody ve frontě + Mimo frontu + Vybrané epizody mimo frontu Řadit dle Názvu (A \u2192 Z) Názvu (Z \u2192 A) diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml index 7432f5537..bf7f1a435 100644 --- a/core/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -400,6 +400,7 @@ Exportfehler OPML Export erfolgreich Die OPML Datei wurde unter dem folgenden Pfad gespeichert:\u0020 + Zugriff auf externen Speicher wird benötigt, um die OPML Datei zu lesen Schlummerfunktion Schlummerfunktion deaktivieren @@ -458,6 +459,7 @@ Neuer Ordner Datenordner auswählen Bitte wähle eine Basis für deinen Datenordner. AntennaPod erstellt automatisch die richtigen Unterverzeichnisse. + Zugriff auf den externen Speicher wird benötigt, um den Datenordner zu ändern Neuen Ordner mit Namen \"%1$s\" erstellen? Neuer Ordner angelegt Kann in diesem Ordner nicht schreiben @@ -500,6 +502,13 @@ Authentifizierung Ändere den Benutzernamen und das Passwort für diesen Podcast und dessen Episoden. + Einstellungen für Automatischen Download + Episoden-Filter + Liste von Wörtern, die dazu verwendet wird, Episoden beim automatischen Download einzubeziehen oder auszuschließen + Einbeziehen + Ausschließen + Einzelne Wörter\n\"Mehrere Wörter\" + Aktuell halten Datenbank wird aktualisiert @@ -519,6 +528,10 @@ Heruntergeladene Episoden ausgewählt Nicht heruntergeladen Nicht heruntergeladene Episoden ausgewählt + In Abspielliste + Episoden in Abspielliste ausgewählt + Nicht in Abspielliste + Episoden nicht in Abspielliste ausgewählt Sortiere nach… Titel (A \u2192 Z) Titel (Z \u2192 A) diff --git a/core/src/main/res/values-el/strings.xml b/core/src/main/res/values-el/strings.xml new file mode 100644 index 000000000..60a3213b8 --- /dev/null +++ b/core/src/main/res/values-el/strings.xml @@ -0,0 +1,358 @@ + + + + AntennaPod + Ροές + PODCASTS + Επεισόδια + Νέα Επεισόδια + Όλα τα Επεισόδια + Όλα + Αγαπημένα + Νέα + Ρυθμίσεις + Λήψεις + Εκτέλεση + Ολοκληρώθηκε + Είσοδος + Ιστορικό Αναπαραγωγής + gpodder.net + gpodder.net Σύνδεση + + Πρόσφατα δημοσιεύθηκε + Εμφάνιση μόνο νέων Επεισοδίων + + Άνοιγμα μενού + Κλείσιμο μενού + Ταξινόμηση αλφαβητικά + Ταξινόμηση κατά ημερομηνία δημοσίευσης + Αριθμός νέων επεισοδίων + + Άνοιγμα στον Περιηγητή + Αντιγραφή διεύθυνσης URL + Μοιρασμα URL + Αντιγραφή URL στο Πρόχειρο + + Εκκαθάριση Ιστορικού + + Επιβεβαίωση + Ακύρωση + Δημιουργος + Γλωσσα + Ρυθμισεις + Εικονα + Σφαλμα + Παρουσιάστηκε ένα σφάλμα: + Ανανέωση + Καμία εξωτερική αποθήκευση είναι διαθέσιμη. Παρακαλώ βεβαιωθείτε ότι η εξωτερική αποθήκευση έχει τοποθετηθεί έτσι ώστε η εφαρμογή να μπορεί να λειτουργήσει σωστά. + Κεφάλαια + Εμφάνιση Σημειώσεων + Περιγραφή + \u0020επεισοδια + Μήκος:\u0020 + Μέγεθος:\u0020 + Επεξεργασία + Αποθήκευση του όνοματος χρήστη και του κωδικόυ πρόσβασης + Κλείσιμο + Επανάληψη + Συμπερίληψη στην αυτόματη λήψη + \u0020παράλληλες λήψεις + Πάντα + Ποτέ + Ποτέ + + URL της Ροής + www.example.com/feed + Προσθήκη Podcast με τη διεύθυνση URL + Μπορείτε να ψάξετε για νέα podcast από το όνομα, κατηγορία ή δημοτικότητα στον κατάλογο του iTunes. + Περιήγηση στο gpodder.net + + Εμφάνιση πληροφοριών + Κατάργηση Podcast + Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράφθουν αυτες οι τροφοδοσιες και όλα τα επεισόδια του υλικού αυτού που έχετε κανει λήψη. + Απόκρυψη Επεισοδίων + Ειλημμένα + {fa-exclamation-circle} Η Τελευταία Ανανέωση Απέτυχε + + Λήψη + Αναπαραγωγή + Παύση + Στοπ + Ροή + Κατάργηση + Προσθήκη σε αναμονή κλήσης + Κατάργηση απο την αναμονή κλήσης + Προσθήκη στα Αγαπημένα + Προσθήκη από τα Αγαπημένα + Επισκεφθείτε την ιστοσελίδα + Flattr αυτό + Τοποθέτηση στην αναμονή ολων + Λήψη όλων + Μετάβαση επεισοδίων + Ενεργοποίηση Αυτόματης Λήψης + Απενεργοποίηση Αυτόματης Λήψης + Επαναφορά Θέσης Αναπαραγωγής + + επιτυχής + απέτυχε + Λήψη σε εκκρεμότητα + Λήψη εν λειτουργία + Η Συσκευή Αποθήκευσης δεν υπάρχει + Σφάλμα Αρχείου + Σφάλμα HTTP Δεδομένων + Άγνωστο σφάλμα + Αναλυτής εξαίρεσης + Σφάλμα Σύνδεσης + Σφάλμα Αυθεντικοποίησης + Ακύρωση όλων των λήψεων + Η Λήψη ακυρώθηκε + Οι Λήψεις ολοκληρώθηκαν με σφάλμα(τα) + Αναφορά Λήψεων + Εσφαλμένη διεύθυνση URL + IO Σφαλμα + Σφάλμα Πρόσβασης Βάσης Δεδομένων + Λήψη Επεξεργασίας + Λήψη podcast δεδομένων + %1$d λήψη πέτυχε, %2$d απέτυχε + Άγνωστος Τίτλος + Τροφοδοσία + Αρχείο πολυμέσων + Εικόνα + Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια να κάνετε λήψη του αρχείου: \ u0020 + Απαιτείται έλεγχος ταυτότητας + Ο πόρος που ζητήσατε απαιτεί ένα όνομα χρήστη και έναν κωδικό πρόσβασης + Τοποθέτηση στην ουρά αναμονής + + Σφάλμα! + Δεν απαραγωνται πολυμεσα + Προετοιμασία + Έτοιμοι + Αναζητηση + Ο διακομιστής πέθανε + Άγνωστο σφάλμα + Δεν απαραγωνται πολυμεσα + 00:00:00 + Προσωρινή μνήμη + Αναπαραγωγή του podcast + AntennaPod - Άγνωστα πλήκτρα πολυμέσων: %1$d + + Κλείδωμα Ουράς Αναμονής + Ξεκλείδωμα Ουράς Αναμονής + Εκκαθάριση Ουράς Αναμονής + Αναίρεση + Στοιχεία αφαιρούνται + Μετακίνηση στην κορυφή + Μετακίνηση προς τα κάτω + Ταξινόμηση + Αλφαβητικά + Ημερομηνία + Δάρκεια + Αύξουσα + Φθίνουσα + Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράψετε την ουρά όλων των επεισοδίων σε αυτό + + Flattr σύνδεση + Πατήστε το κουμπί παρακάτω για να ξεκινήσει η διαδικασία ελέγχου ταυτότητας. Θα πρέπει να διαβιβάζονται στην οθόνη σύνδεσης Flattr στον browser σας και να σας ζητηθεί να δώσει AntennaPod την άδεια να Flattr πράγματα. Αφού έχετε δώσει την άδεια, θα επιστρέψετε σε αυτήν την οθόνη αυτόματα. + Έλεγχος + Επιστροφή στην αρχική σελίδα + Έλεγχος ταυτότητας ήταν επιτυχής! Μπορείτε τώρα να Flattr πράγματα μέσα από την εφαρμογή. + Δεν βρέθηκε Flattr διακριτικό + Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Πατήστε εδώ για να επικυρωθει. + Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Μπορείτε είτε να συνδέσετε το λογαριασμό σας στο AntennaPod να Flattr πράγματα μέσα από την εφαρμογή ή μπορείτε να επισκεφθείτε την ιστοσελίδα του πράγματος για Flattr εκεί + Έλεγχος + Δράση απαγορεύεται + Το AntennaPod δεν έχει άδεια για τη δράση αυτή. Ο λόγος ειναι οτι θα μπορούσε να είναι ότι το διακριτικό πρόσβασης του AntennaPod στο λογαριασμό σας έχει ανακληθεί. Μπορείτε να κανετε εκ νέου τον ελεγχο ταυτοποιησης ή επισκεφθείτε την ιστοσελίδα του πράγματος. + Πρόσβαση ανακαλείται + Έχετε ανακαλέσει επιτυχώς διακριτικό πρόσβασης AntennaPod στον λογαριασμό σας. Για να ολοκληρωθεί η διαδικασία, θα πρέπει να αφαιρέσετε αυτή η εφαρμογή από τον κατάλογο των εγκεκριμένων αιτήσεων στις ρυθμίσεις του λογαριασμού σας στην Flattr ιστοσελίδα. + + Flattr\'ed ένα πράγμα! + Flattr\'ed%d πράγματα! + Flattr\'ed: %s. + Αποτυχία Flattr%d πράγματα! + Οχι flattr\'ed: %s. + Πράγμα θα flattr\'ed αργότερα + Flattring %s + Το AntennaPod είναι flattring + Το AntennaPod έχει flattr\'ed + AntennaPod Flattr απέτυχε + Ανάκτηση flattr\'ed πραγμάτων + + Λήψη Πρόσθετου + Το Πρόσθετο δεν είναι εγκατεστημένο + Ταχύτητες αναπαραγωγής + + Δεν υπάρχουν στοιχεία σε αυτή τη λίστα. + Δεν έχετε εγγραφεί σε οποιεσδήποτε τροφοδοσίες ακόμα + + Άλλα + Σχετικά με + Σειρά αναμονής + Υπηρεσίες + Flattr + Συνέχιση της αναπαραγωγής, όταν τα ακουστικά επανασυνδέονται + Μετάβαση στο επόμενο στοιχείο σειράς αναμονής όταν η αναπαραγωγή ολοκληρωθεί + Διαγραφή επεισοδίων όταν η αναπαραγωγή ολοκληρωθεί + Αυτόματη διαγραφή + Αναπαραγωγή + Δίκτυο + Λήψη αρχείων πολυμέσων μόνο μέσω WiFi + WiFi λυψη πολυμεσων + Να επιτρέπονται ενημερώσεις μέσω της σύνδεσης δεδομένων κινητής τηλεφωνίας + Ανανεωση + Flattr Ρυθμισεις + Flattr Συνδεση + Συνδεθείτε στον Flattr λογαριασμό σας για να Flattr πράγματα απευθείας από την εφαρμογή. + Υποστήριξη της ανάπτυξης του AntennaPod flattring αυτό. Ευχαριστούμε! + Ανάκληση πρόσβασης + Ανακληση της άδειας πρόσβασης στον Flattr λογαριασμό για αυτη την εφαρμογή. + Αυτόματο Flattr + Διαμόρφωση αυτόματου flattring + Περιβάλλον χρήστη + Αλλαγή της εμφάνισης του AntennaPod. + Ρύθμιση της αυτόματης λήψης των επεισοδίων. + Ενεργοποίηση Wi-Fi φίλτρου + Να επιτρέπεται η αυτόματη λήψη μόνο στα επιλεγμένα δίκτυα Wi-Fi. + Λήψη όταν δεν φορτίζει + Επιτρέψετε την αυτόματη λήψη όταν η μπαταρία δεν φορτίζει + Φως + Σκοτάδι + Απεριόριστα + ώρες + ώρα + Εγχειρίδιο + Σύνδεση + Σύνδεση με τον λογαριασμό σας στο gpodder.net σας για να συγχρονίσετε τις συνδρομές σας. + Αποσύνδεση + Η Αποσύνδεση ήταν επιτυχής + Αλλαγή στοιχείων σύνδεσης + Αλλαγή στοιχείων σύνδεσης για το λογαριασμό σας στο gpodder.net. + Ταχύτητα αναπαραγωγής + Προσαρμόστε τις διαθέσιμες ταχύτητες για αναπαραγωγή ήχου μεταβλητής ταχύτητας + Ορισμός κεντρικού υπολογιστή + Χρήση προεπιλεγμένης υποδοχής + Ανάπτυξη κοινοποίησης + Πάντα επέκταση της ειδοποίησης για εμφανιση κουμπιων αναπαραγωγής. + Διατηρηση των ελέγχων κοινοποίησης και lockscreen όταν γίνεται παύση της αναπαραγωγής. + Εκδόσεις του Android πριν από το 4.1 δεν υποστηρίζουν εκτεταμένες κοινοποιήσεις. + Προσθήκη νέων επεισοδίων στο μπροστινό μέρος της ουράς. + Τοποθέτηση στην Αρχή της Ουράς + Πειραματικό + + Ενεργοποίηση αυτόματου flattring + Flattr επεισόδιο συντομότερο απο %d τοις εκατό έχει παιχτεί + Flattr επεισόδιο όταν αρχίζει η αναπαραγωγή + Flattr επεισόδιο όταν ολοκληρωθεί η αναπαραγωγή του + + Αναζήτηση για Τροφοδοσίες ή Επεισόδια + Βρέθηκε στις σημειώσεις + Βρέθηκε σε κεφάλαια + Δεν βρέθηκαν αποτελέσματα + Αναζήτηση + Βρέθηκε στον τίτλο + + Τα OPML αρχεία σας επιτρέπουν να μετακινήσετε τα podcast από το ένα στο άλλο podcatcher. + Επιλέξτε μια συγκεκριμένη διαδρομή αρχείου από το τοπικό σύστημα αρχείων. + Χρησιμοποιήστε μια εξωτερική εφαρμογη όπως το Dropbox, το Google Drive ή τον αγαπημένο σας διαχειριστή αρχείων για να ανοίξετε ένα αρχείο OPML. + Πολλές από τις εφαρμογές όπως το Google Mail, Dropbox, το Google Drive και οι περισσότεροι διαχειριστές αρχείων μπορούν να <i> ανοικτό </ i> Τα αρχεία OPML <i> με </ i> AntennaPod. + Εναρξη εισαγωγής + Εισαγωγή OPML + ΣΦΑΛΜΑ! + Ανάγνωση αρχείου OPML + Παρουσιάστηκε σφάλμα κατά την ανάγνωση του εγγράφου OPML: + Ο κατάλογος εισαγωγής είναι άδειος. + Επιλογή όλων + Αποεπιλογή όλων + Από το τοπικό σύστημα αρχείων + Χρησιμοποιήστε εξωτερική εφαρμογή + OPML εξαγωγή + Σφάλμα κατά την εξαγωγή + Η Εξαγωγή OPML είναι επιτυχής + Το αρχείο .opml συντάχθηκε για:\u0020 + + Ρύθμιση του χρονοδιακόπτη ύπνου + Απενεργοποίηση χρονοδιακόπτη ύπνου + Εισαγωγη χρονου + Χρονοδιακόπτης ύπνου + Χρόνος που απομένει:\u0020 + Μη έγκυρη εισαγωγή, ο χρόνος πρέπει να είναι ακέραιος + δευτερόλεπτα + λεπτά + ώρες + + ΚΑΤΗΓΟΡΙΕΣ + ΚΟΡΥΦΑΙΑ PODCAST + ΠΡΟΤΑΣΕΙΣ + Αναζήτηση στο gpodder.net + Σύνδεση + Καλώς ήρθατε στη διαδικασία σύνδεσης με το gpodder.net. Πρώτον, πληκτρολογήστε τα στοιχεία σύνδεσής σας: + Σύνδεση + Εάν δεν έχετε ακόμα λογαριασμό, μπορείτε να δημιουργήσετε έναν εδώ:\nhttps://gpodder.net/register/ + Όνομα Χρήστη + Κωδικός + Επιλογή συσκευής + Δημιουργήστε μια νέα συσκευή που θα χρησιμοποιηθεί για λογαριασμό του gpodder.net ή επιλέξτε μια ήδη υπάρχουσα: + Αναγνωριστικό συσκευής:\u0020 + Επικεφαλίδα + Δημιουργία νέας συσκευής + Επιλογή υπάρχουσας συσκευής: + Το Αναγνωριστικό συσκευής δεν πρέπει να είναι κενό + Το Αναγνωριστικό συσκευής ειναι ήδη σε χρήση + Επιλογή + Είσοδος επιτυχής! + Συγχαρητήρια! Ο Λογαριασμός σας στο gpodder.net συνδέεται πλέον με τη συσκευή σας. Το AntennaPod θα συγχρονίζει αυτόματα τις συνδρομές στην συσκευή σας με το λογαριασμό σας στο gpodder.net. + Έναρξη συγχρονισμού τώρα + Μετάβαση στην κύρια οθόνη + gpodder.net σφάλμα ελέγχου ταυτότητας + Λάθος όνομα χρήστη ή κωδικός πρόσβασης + gpodder.net σφάλμα συγχρονισμού + Παρουσιάστηκε σφάλμα κατά το συγχρονισμό:\u0020 + + Επιλεγμένος φάκελος: + Δημιουργία φακέλου + Δημιουργία νέου φακέλου με το όνομα \"%1$s\"; + Δημιουργήθηκε ο νέος φάκελος + Δεν είναι δυνατή η εγγραφή σε αυτόν το φάκελο + Ο φάκελος ήδη υπάρχει + Δεν ήταν δυνατή η δημιουργία φακέλου + Ο φάκελος δεν είναι άδειος + Ο φάκελος που επιλέξατε δεν είναι άδειος. Λήψεις πολυμεσων και άλλων αρχείων, θα τοποθετουνται απευθείας σε αυτό τον φάκελο. Θέλετε να συνεχίσετε; + Επιλογή προεπιλεγμένου φακέλου + Παύση της αναπαραγωγής, αντί της μείωσης έντασης όταν μια άλλη εφαρμογή θέλει να αναπαράξει ήχους + Παύση για διακοπές + Συνέχιση της αναπαραγωγής, μετά το πέρας τηλεφωνικής κλήσης + Συνέχιση της αναπαραγωγής, μετά από Κλήση + Το AntennaPod χρειάζεται επανεκκίνηση για την εφαρμογή των αλλαγών. + + Εγγραφή + Εγγεγραμμένα + + Εμφάνιση κεφαλαίων + Εμφάνιση σημειώσεων + Εμφάνιση εικόνας + Κίνηση εμπρός + Γρήγορη κίνηση εμπρός + Ήχος + Βίντεο + Πλοήγηση προς τα πάνω + Περισσότερες ενέργειες + Το επεισόδιο αναπαράγεται + Το επεισόδιο γίνεται λήφθετε + Το επεισόδιο εχει ληφθει + Το Στοιχείο είναι νέο + Το επεισόδιο είναι στη σειρά αναμονής + Αριθμός νέων επεισοδίων + Αριθμός επεισοδίων που έχετε αρχίσει να ακούτε + Σύρετε για να αλλάξετε τη θέση αυτού του στοιχείου + Τοποθέτηση επόμενης σελίδας + + Πιστοποίηση + Αλλαγή του όνοματος χρήστη και του κωδικόυ πρόσβασής για αυτό το podcast και τα επεισόδια του. + + + Εισαγωγή εγγραφών από εφαρμογές και μονο... + iTunes Αναζήτηση + Όλα + Ειλημμένα + + + diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml index a2abd5d85..bee1d5903 100644 --- a/core/src/main/res/values-es/strings.xml +++ b/core/src/main/res/values-es/strings.xml @@ -23,6 +23,8 @@ gpodder.net Iniciar sesión en gpodder.net %1$s libre + Caché de episodios completa + Se ha alcanzado el límite de caché de episodios. Puedes aumentar el tamaño de la caché en las Opciones. Publicados recientemente Mostrar solo episodios nuevos @@ -251,6 +253,7 @@ Descargar complemento Complemento no instalado + Para que funciona la velocidad de reproducción variable, recomendamos habilitar el reproductor Sonic Media [Android 4.1+].\n\nPor otro lado, puedes descargar el plugin de terceros Prestissimo de la Play Store.\nCualquier problema con Prestissimo no es reponsabilidad de AntennaPod y no debería ser reportado al propietario del plugin. Velocidades de reproducción Activar Sonic @@ -361,6 +364,7 @@ Enviar e-mail Experimental Sonic media player + Usar el reproductor Sonic Media incorporado en lugar del reproductor multimedia de Android y Prestissimo Valor actual: %1$s Habilitar Flattr automático @@ -396,6 +400,7 @@ Error en la exportación Exportación a OPML exitosa El archivo OPML se ha escrito en:\u0020 + Es necesario el acceso al almacenamiento externo para leer archivos OPML Establecer un temporizador Desactivar el temporizador @@ -454,6 +459,7 @@ Crear carpeta Elegir carpeta de datos Por favor elige la raíz de la carpeta de datos. AntennaPod creará los subdirectorios apropiados. + Se necesita acceso a almacenamiento externo para cambiar la carpeta de datos ¿Crear carpeta con nombre «%1$s»? Carpeta creada No se puede escribir a esta carpeta @@ -496,6 +502,13 @@ Autenticación Cambiar nombre y contraseña de este podcast y sus episodios + Opciones de Auto Descarga + Filtro de Episodios + Listado de términos para decidir si un episodio debe ser incluído o excluído al auto descargar + Incluir + Excluir + Palabras sueltas \n\"Múltiples palabras\" + Mantener actualizado Actualizando la base de datos @@ -515,6 +528,10 @@ Seleccionados episodios descargados No descargado Seleccionados episodios no descargados + En cola + Seleccionados episodios en cola + No en cola + Seleccionados episodios no en cola Ordenar por… Título (A \u2192 Z) Título (Z \u2192 A) @@ -535,4 +552,6 @@ I D Efectos de audio + Downmix: De estereo a mono + Sólo Sonic diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-fi/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml index 38eef41df..239946097 100644 --- a/core/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -400,6 +400,7 @@ Erreur d\'exportation Exportation OPML réussie. Le fichier .opml a été écrit ici :\u0020 + L\'accès aux stockages externes est requis pour lire le fichier OPML Définir le minuteur d\'arrêt automatique Désactiver le minuteur d\'arrêt automatique @@ -500,6 +501,13 @@ Authentification Modifier votre identifiant et mot de passe pour ce podcast et tous ses épisodes + Préférence de téléchargement automatique + Filtre d\'épisode + Liste de mots décidant si un épisode est à inclure ou exclure des téléchargements automatiques + Inclure + Exclure + Mots uniques \n\"Liste de mots\" + Mettre à jour Mise à jour de la base de données @@ -519,6 +527,10 @@ Episodes téléchargés sélectionnés Non téléchargés Épisodes non téléchargés sélectionnés + Dans liste de lecture + Episodes présents dans la liste de lecture sélectionnés + Hors liste de lecture + Episodes absents de la liste de lecture sélectionnés Trier par... Titre (A \u2192 Z) Titre (Z \u2192 A) diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-hu/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-id/strings.xml b/core/src/main/res/values-id/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-id/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..84f60ab38 --- /dev/null +++ b/core/src/main/res/values-it/strings.xml @@ -0,0 +1,290 @@ + + + + AntennaPod + Feed + Aggiungi un podcast + PODCAST + Episodi + Episodi nuovi + Tutti gli episodi + Tutto + Preferiti + Nuovo + Lista d\'attesa + Impostazioni + Aggiungi un podcast + Download + In corso + Completati + Registro + Annulla\nil download + Cronologia delle riproduzioni + gpodder.net + Accesso a gpodder.net + + Pubblicati di recente + + Apri il menù + Chiudi il menù + Ordina alfabeticamente + Ordina secondo la data di pubblicazione + Numero di episodi nuovi + Numero di episodi non riprodotti + + Apri nel browser + Copia l\'URL + Condividi l\'URL + + + Conferma + Annulla + + No + Autore + Lingua + URL + Impostazioni + Immagine + Errore + È avvenuto un errore: + Ricarica + Capitoli + Descrizione + \u0020episodi + Lunghezza:\u0020 + Dimensione:\u0020 + Processando + Salva il nome utente e la password + Chiudi + Riprova + Includi nei download automatici + Applica agli episodi precedenti + \u0020download paralleli + Globale + Sempre + Mai + Mai + Dopo il completamento + + 1 giorno dopo il completamento + %d giorni dopo il completamento + + + URL del feed + www.example.com/feed + Aggiungi un podcast inserendo un URL + Puoi cercare nuovi podcast per nome, categoria o popolarità su gpodder.net, oppure sull\'iTunes store. + Esplora gpodder.net + + Segna tutti come riprodotti + Conferma che desideri segnare tutti gli episodi come riprodotti. + Conferma che desideri segnare tutti gli episodi in questo feed come riprodotti. + Mostra delle informazioni + Conferma che desideri cancellare questo feed e TUTTI gli episodi di questo feed che hai scaricato. + Nascondi gli episodi + Applica le azioni + Non riprodotti + In pausa + Riprodotto + In coda + Non in coda + Scaricato + Non scaricato + Filtrato + + Scarica + Riproduci + Metti in pausa + Interrompi + Stream + Rimuovi + Segna come riprodotto + Segnato come riprodotto + Segna come non riprodotto + Aggiungi alla coda + Aggiunto alla Coda + Rimuovi dalla coda + Visita il sito web + Metti tutti in coda + Scarica tutti + Salta l\'episodio + + successo + fallito + Download in attesa + Download in corso + Errore dei dati HTTP + Errore sconosciuto + Annulla tutti i download + Download annullato + Download annullato\nDisabilitato Download Automatico per questo elemento + URL malformato + Errore IO + Download dei dati del podcast in corso + %1$d download hanno avuto successo, %2$d hanno fallito + Feed + File multimediale + Immagine + Si è verificato un errore nello scaricare il file:\u0020 + Autenticazione richiesta + La risorsa che hai richiesto richiede un nome utente e una password + + Errore! + Nessun elemento multimediale in riproduzione + Preparazione in corso + Pronto + Ricerca in corso + Server morto + Errore sconosciuto + Nessun elemento multimediale in riproduzione + 00:00:00 + Buffer in corso + Riproduzione del podcast in corso + + Annulla + Oggetto rimosso + Sposta in cima + Sposta in fondo + Ordina + In ordine alfabetico + Data + Durata + Ascendente + Discendente + + Accesso a Flattr + Autentica + Ritorna alla pagina iniziale + Il tuo account flattr non sembra connesso ad AntennaPod. Clicca qui per accedere. + Autentica + Azione proibita + Accesso revocato + + + Scarica plugin + Plugin non installato + Velocità di riproduzione + + Non ci sono oggetti in questo elenco. + Non sei ancora iscritto a nessun feed. + + Altro + Riguardo a + Coda + Servizi + Flattr + Riprendi la riproduzione quando le cuffie vengono ricollegate + Salta all\'elemento successivo della lista al termine della riproduzione + Elimina l\'episodio al termine della riproduzione + Eliminazione Automatica + Riproduzione + Rete + Permetti gli aggiornamenti su rete dati + Ricaricamento + Accesso a Flattr + Revoca l\'accesso + Interfaccia utente + Cambia l\'aspetto di AntennaPod + Abilita il filtro Wi-Fi + Scarica automaticamente quando la batteria non è in caricamento + Chiaro + Scuro + Illimitato + ore + ora + Manuale + Accesso + Esci + Cambia le informazioni di accesso + Velocità di riproduzione + Imposta il nome dell\'host + Utilizza l\'host predefinito + Espandi le notifiche + Aggiungi un nuovo episodio in testa alla coda. + Disabilitato + + + Cerca dei feed o degli episodi + Trovato nei capitoli + Nessun risultato trovato + Cerca + Trovato nel titolo + + Avvia l\'importazione + ERRORE! + La directory dell\'importazione è vuota. + Seleziona tutto + Deseleziona tutto + Usa un\'applicazione esterna + Esportazione OPML + Errore di esportazione + + Imposta timer per lo spegnimento + Disabilta timer per lo spegnimento + Timer per lo spegnimento + Tempo rimasto:\u0020 + Input non valido, il tempo deve essere un numero intero + + CATEGORIE + PODCAST PIÙ POPOLARI + SUGGERIMENTI + Cerca su gpodder.net + Accesso + Benvenuto nella procedura di accesso a gpodder.net. Per prima cosa, inserisci i tuoi dati di accesso: + Accesso + Se non hai ancora un account , puoi crearne uno su:\nhttps://gpodder.net/register/ + Nome utente + Password + Selezione del dispositivo + ID del dispositivo:\u0020 + Crea un nuovo dispositivo + Scegli un dispositivo esistente: + L\'ID del dispositivo non può essere vuoto + ID del dispositivo già in uso + Scegli + Accesso avvenuto con successo! + Avvia ora la sincronizzazione + Vai alla schermata principale + errore di autenticazione di gpodder.net + Nome utente o password errati + errore di sincronizzazione di gpodder.net + È avvenuto un errore durante la sincronizzazione:\u0020 + + Cartella selezionata: + Crea una cartella + Creare una nuova cartella dal nome \"%1$s\"? + Creata una nuova cartella + Non è possibile scrivere in questa cartella + La cartella esiste già + Non è stato possibile creare la cartella + La cartella non è vuota + Scegli la cartella predefinita + + Abbonati + Abbonato + + Mostra i capitoli + Mostra l\'immagine + Riavvolgi + Avanti veloce + Audio + Video + Altre azioni + L\'episodio sta venendo riprodotto + L\'episodio sta venendo scaricato + L\'episodio è stato scaricato + L\'oggetto è nuovo + L\'episodio è in coda + Numero di episodi nuovi + Numero di episodi che hai iniziato ad ascoltare + Carica la pagina successiva + + Autenticazione + + + Cerca su iTunes + Tutto + + + diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml index 3e3b5b97f..836af9fc0 100644 --- a/core/src/main/res/values-ja/strings.xml +++ b/core/src/main/res/values-ja/strings.xml @@ -398,6 +398,7 @@ エクスポートエラー OPMLをエクスポートしました。 .opml ファイルを書き込みました:\u0020 + OPML ファイルを読み込むために、外部ストレージへのアクセスが必要です スリープタイマーをセット スリープタイマーを無効にする @@ -453,6 +454,7 @@ フォルダーを作成 データ フォルダーを選択 基本のデータフォルダーを選択してください。 AntennaPodは、適切なサブディレクトリを作成します。 + データフォルダーを変更するために外部ストレージのアクセスが必要です 名前 \"%1$s\" で新しいフォルダーを作成しますか? 新しいフォルダーを作成しました このフォルダーに書き込みできません @@ -495,6 +497,13 @@ 認証 このポッドキャストとそのエピソード用のあなたのユーザー名とパスワードを変更します。 + 自動ダウンロード設定 + エピソード フィルター + 自動ダウンロードのときに、エピソードを含めるか除外する必要があるかを決定するために使用される条件のリスト + 含む + 含まない + 単一の単語 \n\"複数の 単語\" + 更新済を保持 データベースをアップグレードしています @@ -514,6 +523,10 @@ ダウンロード済のエピソードを選択しました ダウンロードしていません ダウンロードしていないエピソードを選択しました + キューに入れました + キューに入ったエピソードを選択しました + キューに入っていません + キューに入っていないエピソードを選択しました 並び替え… タイトル (A \u2192 Z) タイトル (Z \u2192 A) diff --git a/core/src/main/res/values-kn-rIN/strings.xml b/core/src/main/res/values-kn-rIN/strings.xml new file mode 100644 index 000000000..c95dfba8d --- /dev/null +++ b/core/src/main/res/values-kn-rIN/strings.xml @@ -0,0 +1,103 @@ + + + + ಆಂಟೆನಾಪಾಡ್ + ಫೀಡ್ಗಳು + ಹೊಸ + ಸೆಟ್ಟಿಂಗ್ಗಳು + ಇಳಿಕೆಗಳು + + + + + + ದೃಢೀಕರಿಸಿ + ರದ್ದುಗೊಳಿಸು + ಲೇಖಕ + ಭಾಷೆ + ದೋಷ + ದೋಷ ಕಂಡುಬಂದಿದೆ: + ತಾಜಾ + ಬಾಹ್ಯ ಸಂಗ್ರಹ ಲಭ್ಯವಿಲ್ಲ. ಅಪ್ಲಿಕೇಶನ್ ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡಲು, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಆರೋಹಿಸಲಾಗಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ + ಅಧ್ಯಾಯಗಳು + ಟಿಪ್ಪಣಿಗಳು + \u0020ಕಂತುಗಳು + ಉದ್ದ:\u0020 + ಗಾತ್ರ:\u0020 + ಸಂಸ್ಕರಣೆ + + ಫೀಡ್ ಯು.ಆರ್.ಎಲ್ + + ಮಾಹಿತಿ ತೋರಿಸು + ನೀವು ಈ ಫೀಡ್ ಮತ್ತು ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಈ ಫೀಡ್ನ ಎಲ್ಲಾ ಕಂತುಗಳು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ದಯವಿಟ್ಟು ದೃಢಪಡಿಸಿ. + + ಡೌನ್ಲೋಡ್ + ಚಾಲನೆಗೊಳಿಸು + ಹೊಳೆ + ತೆಗೆದುಹಾಕಿ + ಸರದಿಗೆ ಸೇರಿಸಿ + ಸರದಿಯಿಂದ ತೆಗೆದುಹಾಕಿ + ಜಾಲತಾಣವನ್ನು ಭೇಟಿಮಾಡಿ + ಫ್ಲಾಟರ್ ಮಾಡಿ + + ಡೌನ್ಲೋಡ್ ಬಾಕಿ ಉಳಿದಿದೆ + ಚಾಲನೆಯಲ್ಲಿರುವ ಡೌನ್ಲೋಡ್ + ಎಚ್ಟಿಟಿಪಿ ಮಾಹಿತಿ ದೋಷ + ತಿಳಿಯದ ದೋಷ + ಪಾರ್ಸರ್ ಎಕ್ಸೆಪ್ಶನ್ + ಎಲ್ಲಾ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ರದ್ದು ಮಾಡು + ದೋಷಪೂರಿತ ಯು.ಆರ್.ಎಲ್ + ಐಓ ದೋಷ + + ದೋಷ! + ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ + ಸಿದ್ಧತೆ + ಸಿದ್ಧ + ಅರಸುತ್ತಿರುವ + ಸರ್ವರ್ ಸತ್ತಿದೆ + ತಿಳಿಯದ ದೋಷ + ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ + 00:00:00 + ತುಣಿಗಲೆಯಾಗುತ್ತಿದೆ + + + ಫ್ಳಟರ್ ಪ್ರವೇಶ + ದೃಢೀಕರಣ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಆರಂಭಿಸಲು ಕೆಳಗಿನ ಬಟನ್ ಒತ್ತಿರಿ. ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ ನೀವು ಫ್ಳಟರ್ ಪ್ರವೇಶ ತೆರೆಗೆ ರವಾನಿಸಲ್ಪಡುತ್ತೀರಿ ಮತ್ತು ಆಂಟೆನಾ-ಪಾಡ್ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಲು ಅನುಮತಿ ನೀಡಲು ಕೇಳಲಾಗುತ್ತದೆ. ನೀವು ಅನುಮತಿ ನೀಡಿದ ನಂತರ, ನೀವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಈ ಪರದೆಗೆ ಮರಳಬಹುದು. + ದೃಢೀಕರಿಸು + ಮುಂಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ + ದೃಢೀಕರಣ ಯಶಸ್ವಿಯಾಯಿತು! ನೀವು ಈಗ ಅಪ್ಲಿಕೇಶನ್ ಒಳಗೆ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಬಹುದು. + ಫ್ಳಟರ್ ಟೋಕನ್ ಕಂಡುಬಂದಿಲ್ಲ + ದೃಢೀಕರಿಸು + ಕ್ರಿಯೆಯನ್ನು ನಿಷೇಧಿಸಲಾಗಿದೆ + ಪ್ರವೇಶವನ್ನು ಹಿಂಪಡೆಯಲಾಗಿದೆ + + + + ಈ ಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಅಂಶಗಳು ಇಲ್ಲ. + ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಫೀಡ್ಗಳಿಗೆ ಚಂದಾದಾರರಾಗಿಲ್ಲ. + + ಇತರೆ + ಕುರಿತು + ಸರದಿ + ಹಿನ್ನೆಲೆ + ಜಾಲಬಂಧ + ಬಳಕೆದಾರ ಸಂಪರ್ಕಸಾಧನ + + + ಫೀಡ್ಸ್ ಅಥವಾ ಸಂಚಿಕೆಗಳಿಗಾಗಿ ಹುಡುಕಿ + ಪ್ರದರ್ಶನ ಟಿಪ್ಪಣಿಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ + ಅಧ್ಯಾಯಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ + ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ + ಹುಡುಕು + + + + + + + + + + + + diff --git a/core/src/main/res/values-ko-rKR/strings.xml b/core/src/main/res/values-ko-rKR/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-ko-rKR/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml index 6802cc36d..d0b3aae33 100644 --- a/core/src/main/res/values-ko/strings.xml +++ b/core/src/main/res/values-ko/strings.xml @@ -495,6 +495,13 @@ 인증 이 팟캐스트와 에피소드에 대한 사용자 이름과 비밀번호를 바꿉니다. + 자동 다운로드 설정 + 에피소드 필터 + 자동 다운로드를 할 때 에피소드가 포함되어야할지 제외되어야할지 결정하는 규칙의 목록 + 포함 + 제외 + 단수 단어 \n\"복수 단어\" + 최신 업데이트 유지 데이터베이스 업그레이드 중 diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml index 5cbc40d78..1973cd51b 100644 --- a/core/src/main/res/values-nl/strings.xml +++ b/core/src/main/res/values-nl/strings.xml @@ -97,7 +97,7 @@ U kunt nieuwe podcasts zoeken op naam, categorie of populariteit in de gpodder.net database, of de iTunes winkel doorzoeken. gpodder.net doorbladeren - Alles als beluisterd markeren + Alles als afgespeeld markeren Alle afleveringen als afgespeeld markeren Bevestig aub dat u alle afleveringen als afgespeeld wilt markeren. Bevestig aub dat u alle afleveringen van deze feed als afgespeeld wilt markeren. @@ -267,7 +267,7 @@ Services Flattr Automatisch opschonen - Afleveringen die niet in de wachtrij staan en die niet als favoriet zijn gemarkeerd, mogen verwijderd worden als Automatisch Downloaden ruimte nodig heeft voor nieuwe afleveringen. + Afleveringen die niet in de wachtrij staan én niet als favoriet gemarkeerd zijn, mogen verwijderd worden als Automatisch Downloaden ruimte nodig heeft voor nieuwe afleveringen Afspelen pauzeren wanneer de koptelefoon wordt losgekoppeld of de bluetooth verbinding wordt verbroken Afspelen hervatten wanneer de koptelefoon opnieuw wordt aangesloten Afspelen hervatten wanneer de bluetooth verbinding hervat wordt @@ -276,7 +276,7 @@ Volgende item in de wachtrij afspelen als de aflevering voltooid is Afleveringen verwijderen als ze zijn afgespeeld Automatisch verwijderen - Als afgespeeld markeren wanneer minder dan een bepaald aantal seconden van de afspeeltijd over is + Afleveringen als afgespeeld markeren wanneer deze nog maar een bepaald aantal seconden duurt Slimme afgespeeld markering Afleveringen bewaren en in de wachtrij houden als u op \'overslaan\' klikt Overgeslagen afleveringen bewaren @@ -390,8 +390,8 @@ OPML-bestand aan het lezen Er is een fout opgetreden bij het lezen van het OPML-bestand: De import map is leeg. - Selecteer alles - Deselecteer alles + Alles selecteren + Alles deselecteren Selecteren… Via bestandsbeheer Via externe app @@ -400,6 +400,7 @@ Export fout OPML bestand succesvol geëxporteerd. Het OPML-bestand is in \u0020 geplaatst + Toegang tot externe locaties is nodig om het OPML-bestand te kunnen lezen Slaap timer instellen Slaap timer uitschakelen @@ -458,6 +459,7 @@ Map aanmaken Kies data map Kies de hoofdmap voor uw data. AntennaPod zal de benodigde submappen creeëren. + Toegang tot de externe opslag is nodig om de data-map aan te passen Maak een nieuwe map aan met de naam \"%1$s\"? Nieuwe map aangemaakt Kan in deze map niet schrijven @@ -469,8 +471,8 @@ Map is niet leeg De map die je hebt gekozen is niet leeg. Media downloads en andere bestanden zullen rechtstreeks in deze map geplaatst worden. Toch doorgaan? Kies default map - Het afspelen onderbreken in plaats van het volume te verlagen wanneer er een andere app geluiden af wilt spelen - Pauze voor onderbrekingen + Het afspelen onderbreken in plaats van het volume te verlagen wanneer er een andere app geluiden af wil spelen + Pauzeren bij onderbrekingen Afspelen hervatten na beëindigen telefoongesprek Hervatten na gesprek AntennaPod moet opnieuw worden opgestart om deze wijziging door te voeren. @@ -500,6 +502,12 @@ Authenticatie Gebruikersnaam en wachtwoord aanpassen voor deze podcast + Instellingen voor Automatisch downloaden + Afleveringenfilter + Lijst van zoektermen die bepalen of een aflevering meegenomen of uitgesloten wordt bij automatisch downloaden + Meenemen + Uitsluiten + Up to date houden Database upgraden @@ -519,6 +527,10 @@ Gedownloadde afleveringen geselecteerd Niet gedownload Niet gedownloadde afleveringen geselecteerd + In de wachtrij + Afleveringen in de wachtrij selecteren + Niet in de wachtrij + Afleveringen geselecteerd die niet in de wachtrij staan Sorteren op… Titel (A \u2192 Z) Titel (A \u2192 A) diff --git a/core/src/main/res/values-no-rNB/strings.xml b/core/src/main/res/values-no-rNB/strings.xml new file mode 100644 index 000000000..e3aa1ca5d --- /dev/null +++ b/core/src/main/res/values-no-rNB/strings.xml @@ -0,0 +1,510 @@ + + + + AntennaPod + Strømmer + Legg til podcast + PODCASTER + Episoder + Nye episoder + Alle episoder + Alle + Favoritter + Nye + Venteliste + Innstillinger + Legg til podcast + Nedlastninger + Kjører + Fullført + Logg + Avbryt\nLast ned + Avspillingshistorikk + gpodder.net + gpodder.net-innlogging + %1$s ledig + + Nylig publisert + Vis kun nye episoder + + Åpne menyen + Lukk menyen + Skuff-innstillinger + Sorter på teller + Sorter alfabetisk + Sorter på utgivelsesdato + Antall nye og uavspilte episoder + Antall nye episoder + Antall uavspilte episoder + Ingen + + Åpne i nettleser + Kopier URL + Del URL + URL er kopiert til utklippstavlen + Gå til denne posisjonen + + Tøm historikk + + Bekreft + Avbryt + Ja + Nei + Opphavsperson + Språk + URL + Innstillinger + Bilde + Feil + Det oppsto en feil: + Oppdater + Finner ikke ekstern lagring. Sjekk at det eksterne lagringsmediet er montert. + Kapittel + Shownotater + Beskrivelse + Nyeste episode:\u0020 + \u0020episoder + Lengde:\u0020 + Størrelse:\u0020 + Behandler + Lagre brukernavn og passord + Lukk + Prøv igjen + Inkluder i automatiske nedlastninger + Angi for tidligere episoder + Den nye Automatisk nedlasting-innstillingen vil automatisk aktiveres for nye episoder.\nØnsker du å aktivere den for tidligere utgitte episoder også? + Automatisk sletting av episode\n(overstyr den globale standarden) + \u0020samtidige nedlastinger + Global + Alltid + Aldri + AldriAldri + Når ikke i kø + Etter den er ferdig + + 1 dag etter fullført avspilling + %d dager etter fullført avspilling + + + Strømmens URL + www.example.com/feed + Legg til en podcast via URL + Finn podcast i katalog + Du kan søke etter nye podcaster på navn, kategori eller popularitet i gpodder.nets katalog eller på iTunes. + Bla gjennom gpodder.net + + Marker alle som avspilt + Marker alle episoder som avspilt + Vennligst bekreft at du ønsker å markere alle episoder som avspilt. + Vennligst bekreft at du ønsker å markere alle episoder i denne strømmen som avspilt. + Marker alle som sett + Vis informasjon + Fjern podcast + Del lenke + Del lenke med plassering + Del strømmens URL + Del episodens URL + Del episodens URL med posisjon + Vil du virkelig slette denne strømmen og alle episodene av denne strømmen du har lastet ned? + Fjerner strøm + Oppdater hele strømmen + Skjul episoder + Lagre handlinger + Ikke avspilt + Pauset + Avspilt + I kø + Ikke i kø + Nedlastet + Ikke nedlastet + Filtrert + {fa-exclamation-circle} Siste oppdatering mislyktes + + Last ned + Spill + Pause + Stopp + Stream + Fjern + Fjern episode + Marker som avspilt + Marker som avspilt + Marker som ikke avspilt + Legg til queue + Lagt til i kø + Fjern fra queue + Legg til i favoritter + Fjern fra favoritter + Besøk nettside + Flattr\'e dette + Legg alle til queue + Last ned alle + Skip episode + Aktiver automatisk nedlasting + Deaktiver automatisk nedlasting + Tilbakestill avspillingsposisjon + Element fjernet + + nedlastning lyktes + mislyktes + Nedlastning venter + Nedlasting pågår + Lagringsenhet ikke funnet + Ikke nok plass + Fil-feil + HTTP-datafeil + Ukjent feil + Parser-unntak + Strøm-typen er ikke støttet + Tilkoblingsfeil + Ukjent vert + Autentiseringsfeil + Avbryt alle nedlastninger + Nedlasting avbrutt + Nedlasting avbrutt\nAutomatisk nedlasting for dette elementet er deaktivert + Nedlasting fullført med feilmeldinger + Nedlastingsrapport + Misformet URL + IO feil + Forespørselfeil + Tilgangsfeil for database + Behandler nedlastninger + Laster ned data til podcast + %1$d nedlastninger lyktes, %2$d mislyktes + Ukjent tittel + Strøm + Mediafil + Bilde + En feil oppsto under nedlastningen av filen:\u0020 + Autentisering påkreves + Ressursen du forespør krever brukernavn og passord + Bekreft nedlasting over mobildata + Nedlasting over mobildata er deaktivert i innstillingene.\n\nDu kan velge å legge episoden til i køen eller tillate midlertidig nedlasting over mobildata.\n\nValget ditt vil gjelde i 10 minutter. + Nedlasting over mobildata er deaktivert i innstillingene.\n\nVil du tillate nedlasting over mobildata midlertidig?\n\nValget ditt vil gjelde i 10 minutter. + Legg til i kø + Tillat midlertidig + + Error! + Ingen media spillende for øyeblikket. + Forbereder + Klar + Oppsøker + Serveren døde + Ukjent feil + Ingen media spillende for øyeblikket. + 00:00:00 + Bufrer + Spiller podcast + AntennaPod - Ukjent medienøkkel: %1$d + + Lås køen + Lås opp køen + Slett køen + Angre + Objekt er fjernet + Gå til toppen + Gå til bunnen + Sortér + Alfabetisk + På dato + På varighet + Økende + Synkende + Vennligst bekreft at du ønsker å slette ALLE elementer i køen + + Flattr innlogging + Trykk knappen nedenfor for å starte autentiseringsprosessen. Du vil videresendes til flattr sin innloggsinsskjerm i din nettleser og spurt om å gi AntennaPod tillatelse til å flattr\'e ting. Etter at du har gitt tillatelse blir du returnert hit automatisk. + Autentiser + Returner hjem + Autentisering fullført! Nå kan du flattr tingene i denne appen. + Flattr-token ikke funnet + Det virker som at Flattr-kontoen din ikke er sammenkoblet med AntennaPod. Trykk her for å autentisere. + Det virker ikke som din flattr konto er koblet til AntennaPod. Du kan enten koble kontoen din til AntennaPod for å flattr\'e ting i appen eller du kan besøke nettsiden til tingen for å flattr\'e det der. + Autentiser + Handling forbudt + AntennaPod har ikke tilgang til denne handlingen. Grunnen kan være at tilgangstokenet til kontoen din er blitt inndratt. Du kan enten re-autentisere eller besøke tjenestens nettsted. + Tilgang opphevet + Du har fjernet AntennaPods tilgang til kontoen din. For å fullføre prossessen må du fjerne denne appen fra listen over tillatte apper på flattr-nettsiden. + + Flattr\'erte en ting! + Flattret %d ting! + Flattret: %s. + Klarte ikke flattre %d ting! + Ikke flattret: %s. + Tingen vil bli flattret senere + Flattrer %s + AntennaPod flattrer + AntennaPod har flattret + AntennaPods flattring feilet + Henter flattrede ting + + Last ned programtillegg + Programtillegg er ikke installert + Avspillingshastigheter + Skru på Sonic + + Det er ingen objekter på denne listen. + Du abonnerer ikke på noen strømmer enda. + + Annet + Om + Queue + Tjenester + Flattr + Episodeopprydding + Sett playback på pause når hodetelefoner eller bluetooth er frakoblet + Gjenoppta avspilling når hodetelefoner gjeninnkoples + Fortsett avspilling når bluetooth er tilkoblet igjen + Forover-knapp hopper + Ved pressing av hardware forover-knapp hopp til neste episode istedenfor forover-spoling + Hopp til neste element i køen når avspillingen er ferdig + Slett episode når avspillingen er ferdig + Automatisk sletting + Marker episoder som avspilt selv om det er X antall sekunder igjen av avspillingen + Smart markering av avspilt + Behold episoder når de hoppes over + Behold episoder som er hoppet over + Avspilling + Nettverk + Oppdateringsintervall eler tidspunkt + Spesifiser en intervall eller et spesifikt tidspunkt når strømmer skal oppdateres automatisk + Du kan sette en intervall som «hver andre time», et spesifikt tidspunkt som «07:00» eller skru av automatiske oppdateringer helt.\n\nMerk: Oppdateringstider er ikke eksakte; du kan oppleve små forsinkelser. + Skru av + Sett intervall + Angi klokkeslett + Last ned mediafiler eksklusivt med WiFi + Kontinuerlig avspilling + WiFi media nedlastning + Frakobling av hodetelefoner + Gjeninnkopling av hodetelefoner + Blutetooth tilkoblet igjen + Mobiloppdateringer + Tillat oppdateringer over kobling via mobildata + Oppdaterer + Flattr innstillinger + Flattr logg in + Logg på din flattr konto for å flattr ting direkte fra appen. + Flattr denne appen + Støtt utviklingen av AntennaPod ved å flattr\'e det. Tusen takk! + Opphev tilgang + Opphev tilgangstillatelsen til din flattr konto for denne appen. + Automatisk Flattr + Konfigurer automatisk flattring + Brukergrensesnitt + Velg tema + Skreddersy navigasjonsskuff + Velg utseendet til navigasjonsskuffen. + Velg elementer i navigasjonsskuffen + Endre hvilke elementer som vises i navigeringsfanen. + Velg rekkefølge på abbonement + Endre rekkefølgen på abbonementene dine + Velg abbonementsteller + Endre informasjonen vist av abonnementstelleren + Endre utseendet til AntennaPod + Automatisk nedlasting + Konfigurer automatisk nedlasting av episoder. + Skru på Wi-Fi-filter + Tillat automatisk nedlasting kun for valgte Wi-Fi-nettverk. + Last ned når enheten ikke lader + Tillat automatisk nedlasting når enheten ikke står til lading + Parallelle nedlastinger + Mellomlager for episoder + Lyst + Mørkt + Ulimitert + Timer + Time + Manuelt + Logg inn + Logg inn med din gpodder.net konto for å synkronisere dine abonnementer. + Logg ut + Utloggelse lyktes + Endre innloggingsinformasjon + Endre innlogginsinformasjonen til din gpodder.net konto + Avspillingshastigheter + Egendefiner hastighetene tilgjengelig for variabel avspillingshastighet + Spoling fremover + Spoling bakover + Sett vertsnavn + Bruk standard vert + Utvid varsel + Utvider alltid varselet for å inkludere avspillingsknapper. + Vedvarende avspillingskontroller + Behold varsel- og låseskjermkontroller når avspilling er satt på pause. + Angi som bakgrunn på låseskjermen + Angir låseskjermbakgrunnsbildet til å være den nåværende episodens bilde. Som en sideeffekt vil dette også vise bildet i tredjepartsapper. + Vis nedlastingsrapport + Generer en rapport som viser detaljer dersom nedlastinger feiler. + Android-versjoner tidligere enn 4.1 støtter ikke utvidede varsler. + Legg til nye episoder i begynnelsen av køen. + Legg til foran i køen + Deaktivert + Størrelse for bildemellomlager + Størrelsen på mellomlageret for bilder. + Kræsj-rapport + Send den siste kræsj-rapporten via e-post + Send e-post + Eksperimentell + Sonic medieavspiller + + Aktiver automatisk flattring + Flattre episode så snart %d prosent er avspilt + Flattre episode når avspillingen starter + Flattre episode når avspillingen tar slutt + + Søk etter strømmer eller episoder + Funnet i shownotater + Funnet i kapitler + Ingen resultater ble funnet + Søk + Funnet i tittel + + OPML-filer lar deg flytte podcastene dine fra en podcatcher til en annen. + Valg %1$d + Velg en spesifikk filbane fra det lokale filsystemet. + Bruk en ektern applikasjon som Dropbox, Google Drive eller favoritt-filbehandleren din for å åpne en OPML-fil. + Mange applikasjoner som Gmail, Dropbox, Google Drive og de fleste filbehandlere kan åpne OPML-filer med AntennaPod. + Start importering + OPML-import + ERROR! + Leser OPML-fil + En feil oppsto under lesingen av opml dokumentet: + Importkatalogen er tom. + Velg alle + Opphev alle markeringene + Fra lokalt filsystem + Bruk ekstern applikasjon + OPML-eksportering + Eksporteringserror + OPML-import vellykket. + .opml-filen ble skrevet til:\u0020 + + Sett opp sovetimer + Deaktiver sovetimer + Legg til tid + Sovetimer + Tid igjen:\u0020 + Ugyldig innspill, tid må være et heltall + Når nedtellingen er i ferd med å utløpe: + Rist for å tilbakestille nedtellingen + Vibrer + sekunder + minutter + timer + + 1 sekund + %d sekunder + + + 1 minutt + %d minutter + + + 1 time + %d timer + + + KATEGORIER + TOPP-PODCASTER + FORSLAG + Søk på gpodder.net + Logg inn + Velkommen til gpodder.net innlogginsprosess. Først begynner vi med å skrive inn innlogginsinformasjon. + Logg inn + Dersom du ikke har en konto enda kan du opprette en her:\nhttps://gpodder.net/register/ + Brukernavn + Passord + Enhetsvalg + Lag en ny enhet til å bruke for din gpodder.net konto eller velg en som allerede eksisterer. + EnhetsID:\u0020 + Tekst + Lag en ny enhet + Velg eksisterende enhet: + Device ID kan ikke være tom + EnhetsID er allerede i bruk + Velg + Innlogging lyktes! + Gratulerer! Din gpodder.net konto er nå linket opp med din enhet. AntennaPod vil nå automatisk synkronisere abonnementer på din enhet med din gpodder.net konto. + Start synkronisering nå. + Gå til hovedskjermen + gpodder.net-autentiseringsfeil + Feil brukernavn eller passord. + gpodder.net synkroniseringserror + En feil oppsto under synkronisering av:\u0020 + + Valgt mappe + Lag mappe + Velg datamappe + Vennligst velg basisen for datamappen din. AntennaPod vil lage de nødvendige submappene dine. + Lag en ny mappe med navn \"%1$s\"? + Lagde en ny mappe + Kan ikke skrive til denne mappen + Mappe eksisterer allerede + Kunne ikke lage mappe + %1$s eksisterer ikke + %1$s kan ikke leses + %1$s kan ikke skrives til + Mappen er ikke tom + Mappen du har valgt er ikke tom. Nedlastet media og andre filer vil bli plassert direkte i denne mappen? Vil du fortsette? + Velg standardmappe + Sett pause på playback istedenfor å skru ned volumet når en annen app har lyst å spille av lyder + Pause for avbrytelser + Gjenoppta avspilling etter at telefonsamtaler avsluttes + Gjenoppta etter samtale + AntennaPod må startes om for at denne endringen skal lagres. + + Abonner + Abonnert + + Vis kapitler + Vis notater + Vis bilde + Spol tilbake + Spol fremover + Lyd + Video + Naviger oppover + Flere handlinger + Episode spilles nå + Episode lastes ned nå + Episode har blitt lastet ned + Objekt er nytt + Episoden er i queue + Antall nye episoder + Antall episoder du har begynt å høre på + Dra for å endre posisjonen til dette objektet + Last inn neste side + + Autentisering + Endre brukernavnet og passordet for denne podcasten og dens episoder. + + Oppgraderer databasen + + Importerer abbonementer fra enkeltstående applikasjoner ... + Søk på iTunes + Alle + Valgte alle episoder + Ingen + Fjernet valg av alle episoder + Avspilt + Valgte avspilte episoder + Uavspilt + Valgte uavspilte episoder + Nedlastede + Valgte nedlastede episoder + Ikke nedlastet + Valgte ikke-nedlastede episoder + Tittel (A \u2192 Z) + Tittel (Z \u2192 A) + Dato (Ny \u2192 Gammel) + Dato (Gammel \u2192 Ny) + Lengde (Kort \u2192 Lang) + Lengde (Lang \u2192 Kort) + + Liker du AntennaPod? + Vi ville satt pris på om du tok deg tid til å vurdere AntennaPod. + La meg være i fred + Minn meg på dette senere + Naturligvis, kom igjen! + + diff --git a/core/src/main/res/values-no/strings.xml b/core/src/main/res/values-no/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-no/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml new file mode 100644 index 000000000..784b69c5a --- /dev/null +++ b/core/src/main/res/values-pl/strings.xml @@ -0,0 +1,99 @@ + + + + AntennaPod + PODKASTY + Ustawienia + Dziennik + + Ostatnio opublikowane + + Otwórz menu + Zamknij menu + + Kopiuj URL + Udostępnij URL + + + Potwierdź + Anuluj + Autor + Język + URL + Ustawienia + Obrazek + Błąd + Odśwież + Rozdział + Opis + \u0020 odcinków + Długość:\u0020 + Rozmiar:\u0020 + Zapis nazwę użytkownika i hasło + Zamknij + Ponów + + www.example.com/feed + Przeglądaj gpodder.net + + Zaznacz wszystkie jako przesłuchane + Pokaż informacje + Pobrany + + Pobierz + Odtwórz + Zatrzymaj + Usuń + Zaznacz jako przesłuchany + Zaznacz jako nieprzesłuchany + Dodaj do kolejki + Dodano do kolejki + Usuń z kolejki + Odwiedź stronę + Pobierz wszystko + Pomiń odcinek + + Nieznany błąd + + Błąd! + Serwer umarł + Nieznany błąd + 00:00:00 + Buforowanie + + Sortuj + Data + Czas trwania + Rosnąco + Malejąco + + + + + + Kolejka + Usługi + Pobieraj pliki tylko przez WiFi + Odświeżanie + Interfejs Użytkownika + Wylogowano pomyślnie + + + + + + + Wybrany folder + Utworzyć nowy folder z nazwą \"%1$s\"? + Folder już istnieje + Nie można utworzyć folderu + Folder nie jest pusty + Wybierz domyślny folder + + + + + + + + diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml index f3fbc0623..ebea5f391 100644 --- a/core/src/main/res/values-pt/strings.xml +++ b/core/src/main/res/values-pt/strings.xml @@ -400,6 +400,7 @@ Erro de exportação Exportação efetuada O ficheiro .opml foi guardado em:\u0020 + Requer acesso ao armazenamento externo para ler o ficheiro OPML Definir temporizador Desativar temporizador @@ -458,6 +459,7 @@ Criar pasta Escolha a pasta de dados Escolha a base da pasta de dados. O AntennaPod irá criar as subpastas apropriadas. + Para alterar a pasta de dados, tem que ter acesso ao armazenamento externo Criar uma pasta com o nome \"%1$s\"? Nova pasta criada Não é possível guardar nesta pasta @@ -500,6 +502,13 @@ Autenticação Altere o seu nome de utilizador e palavra-passe para este podcast e seus episódios + Definições de descarga automática + Filtro de episódios + Lista de termos utilizados para determinar se um episódio deve ser incluído ou excluído das descargas automáticas + Incluir + Excluir + Uma palavra\n\"Várias palavras\" + Manter atualizada Atualizando base de dados @@ -519,6 +528,10 @@ Selecionar episódios descarregados Não descarregados Selecionar episódios não descarregados + Na fila + Episódios selecionados na fila + Não na fila + Episódios não selecionados na fila Ordenar por… Título (A \u2192 Z) Título (Z \u2192 A) diff --git a/core/src/main/res/values-sv-rSE/strings.xml b/core/src/main/res/values-sv-rSE/strings.xml index b91b030d6..7407b3474 100644 --- a/core/src/main/res/values-sv-rSE/strings.xml +++ b/core/src/main/res/values-sv-rSE/strings.xml @@ -400,6 +400,7 @@ Exporteringsfel OPML Exportering lyckades. .opml filen skrevs till:\u0020 + Tillgång till extern lagring krävs för att läsa OPML-filen Ställ in sömntimer Stäng av sömntimer @@ -458,6 +459,7 @@ Skapa mapp Välj Datakatalog Välj rotkatalogen för din data. AntennaPod skapar de underkataloger som behövs. + Tillgång till extern lagring krävs för att byta datakatalogen Skapa ny mapp med namnet \"%1$s\"? Skapade ny mapp Kan inte skriva till den här mappen @@ -500,6 +502,13 @@ Autentisering Byt ditt användarnamn och lösenord för den här podcasten och dess episoder. + Automatisk nedladdningsinställningar + Episodfilter + Lista av termer som används för att avgöra om en episod ska inkluderas eller exkluderas vid automatisk nedladdning + Inkludera + Exkludera + Enstaka ord \n\"Flera ord\" + Håll uppdaterad Uppgraderar databasen @@ -519,6 +528,10 @@ Valde nedladdade Episoder Ej nedladdade Valde ej nedladdade Episoder + Köad + Valde köade Episoder + Ej köad + Välj ej köade Episoder Sortera efter… Titel (A \u2192 Ö) Titel (Ö \u2192 A) diff --git a/core/src/main/res/values-uk-rUA/strings.xml b/core/src/main/res/values-uk-rUA/strings.xml index abc5fcec1..f0970a6cd 100644 --- a/core/src/main/res/values-uk-rUA/strings.xml +++ b/core/src/main/res/values-uk-rUA/strings.xml @@ -22,6 +22,9 @@ Що грало gpodder.net gpodder.net логін + %1$s вільно + Кеш епізодів заповнений + Досягнута межа розміра кеша епізодів. Розмір кеша можна збільшити в налаштуваннях. Щойно опубліковано Показати тількі нові епізоди @@ -66,6 +69,7 @@ Довжина:\u0020 Розмір:\u0020 Обробка + Завантажується… Зберегти ім\'я користувача та пароль Закрити Повторити знову @@ -77,6 +81,7 @@ Для всіх Завжди Ніколи + Відправити… Ніколи Якщо не в черзі Після закінчення @@ -100,6 +105,7 @@ Позначити всі як переглянуті Інформація Видалити подкаст + Поділитися… Поділитися URL сайту Поділитись посиланням на позицію Поділитись посиланням на канал @@ -134,7 +140,9 @@ Додано до черги Видалити з черги Додати до улюблених + Додано до улюблених Видалити з улюблених + Видалено з улюблених Відкрити сайт Підтримати за допомогою Flattr Додати до черги @@ -168,6 +176,11 @@ Помилка IO Помилка запиту Помилка бази даних + + %d завантаження залишилось + %d завантаження залишилось + %d завантажень залишилось + Обробка завантаженого Завантаження даних подкасту Завантажилось %1$d успішно, %2$d з помилками @@ -199,6 +212,8 @@ Заблокувати чергу Розблокувати чергу + Чергу заблоковано + Чергу разблоковано Очистити чергу Скасувати Видалено @@ -240,11 +255,13 @@ Завантажити додаток Додаток не встановлено + Для програвання зі змінною швидкістю, ми радимо включити вбудований програвач Sonic [Android 4.1+].\n\nАбо ви можете завантажити додаток Prestissimo із Play Store.\nБудь які проблеми з Prestissimo не є відповідальністю розробників AntennaPod та мають вирішуватись авторами додатка. Швидкість програвання Включити Sonic Нічого в цьому списку Немає підписаних каналів + В цьому епізоді немає розділів. Інше Про програму @@ -252,9 +269,12 @@ Сервіси Flattr Чищення епізодів + Епізоди що не знаходяться в черзі та не помічені як улюблені можуть бути видалені якщо Автозавантажувач потребуватиме місце для нових епізодів. Зупинятись коли навушники або блютуз від’єднано Поновити відтворення коли навушники повторно під’єднано Поновити відтворення коли блютуз повторно під’єднано + Пропуск кнопкой перемотки + При натисканні апаратної кнопки перемотки перейти до наступного епізода замість перемотки. Перейти до наступного епізода в черзі коли поточний закінчено Видалити епізод після повного відтворення Автовидалення @@ -270,6 +290,8 @@ Вимкнути Інтервал Встановити час щодня + кожні %1$s + на %1$s Завантажувати тільки через Wifi Грати безперервно Завантаження через Wifi @@ -339,8 +361,13 @@ Вимкнено Розмір кеша зображень Розмір дискового кеша для зображень. + Звіт про збій + Надіслати е-пошту зі звітом про останній збій + Надіслати е-пошту Експериментальні Програвач Sonic + Застосувати вбудований програвач sonic замість програвача Android та Prestissimo + Поточне значення: %1$s Включити автоматичне заохочення авторів через сервіс flattr Заохотити автора через Flattr щойно %d відсотків епізода було відтворено @@ -367,12 +394,15 @@ Директорія імпорту пуста Обрати все Убрати виділення + Обрати… З локальної файлової системи За допомогою додатка OPML экспорт + Експортується… Помилка експорту OPML експорт успішний OPML файл записаний в:\u0020 + Щоб прочитати файл OPML потрібен доступ до зовнішньої пам’яти Таймер сну Вимкнути засинання @@ -433,11 +463,16 @@ Обрати папку: Нова папка Обрати папку + Оберіть, будь ласка, базовий каталог для даних. AntennaPod створить відповідні підрозділи. + Для зміни папки зберігання даних потрібен доступ до зовнішнього носія Створити папку з ім\'ям \"%1$s\"? Створена нова папка Не можу записати в цю папку Папка вже існує Не можу создати папку + \"%1$s\" не існує + \"%1$s\" недоступний до читання + \"%1$s\" недоступний для запису Папка не є пустою В папці щось є. Всі завантаження зберігаються в цю папку. Все рівно продовжувати? Обрати папку по замовчанню @@ -449,6 +484,7 @@ Підписатися Підписано + Завантажується… Показати глави Показати нотатки @@ -471,11 +507,20 @@ Автентикація Змінити ваші логін та пароль для подкаста та епізодів + Налаштування автозавантаження + Фільтр епізодів + Перелік термінів що використовуються для вирішення чи завантажувати епізод автоматично + Включити + Вилучити + Окремі слова \n\"Слова Разом\" + Підтримувати оновленим Оновлення бази даних Імпорт подкастів з інших програм... Пошук в iTunes + Обрати… + Фільтр Всі Обрано всі епізоди Жодного @@ -488,6 +533,11 @@ Обрано завантажені епізоди Незавантажені Обрано незавантажені епізоди + В черзі + Обрано епізоди що в черзі + Не в черзі + Обрано епізоди що не в черзі + Сортувати за… Назва (А \u2192 Я) Назва (Я \u2192 А) Дата (Нові \u2192 Старі) @@ -495,5 +545,18 @@ Тривалість (Короткі \u2192 Довгі) Тривалість (Довгі \u2192 Короткі) + Оцінити AntennaPod? + Ми будемо вдячні якщо ви поставите свою оцінку AntennaPod. + Не зараз + Нагадати згодом + Звичайно, з задоволенням! + Керування звуком + Швидкість програвання + Гучність + Л + П + Аудіоефекти + Зробити моно із стерео + Тільки Sonic diff --git a/core/src/main/res/values-vi-rVN/strings.xml b/core/src/main/res/values-vi-rVN/strings.xml new file mode 100644 index 000000000..c0e5d73d3 --- /dev/null +++ b/core/src/main/res/values-vi-rVN/strings.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values-vi/strings.xml b/core/src/main/res/values-vi/strings.xml new file mode 100644 index 000000000..f16823f84 --- /dev/null +++ b/core/src/main/res/values-vi/strings.xml @@ -0,0 +1,60 @@ + + + + Các feed + Tạo mới + Thiết lập + Tải về + + + + + + Xác nhận + Hủy bỏ + Tác giả + Ngôn ngữ + Lỗi + Cập nhật lại + Hiện không có thiết bị lưu trữ gắn ngoài nào. Hãy chắc rằng bạn đã kết nối máy của mình với thiết bị lưu trữ gắn ngoài để ứng dụng có thể được hoạt động trơn tru. + Chương + Hiển thị ghi chú + \u0020tập + Độ dài:\u0020 + Kích thước:\u0020 + Đang xử lý + + Đường dẫn liên kết feed + + Hiển thị thông ti + Xin vui lòng xác nhận rằng bạn muốn xóa feed này và toàn bộ các phần khác của feed này mà bạn đã tải về. + + Tải về + Phát + Phân luồng + Loại bỏ + Thêm vào hàng đợi + Loại bỏ khỏi hàng đợi + Truy cập website + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index 48f8ae12b..c3ee4d3e2 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -19,8 +19,6 @@ - - @@ -30,7 +28,6 @@ - @@ -51,6 +48,8 @@ + + diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 37ccbb80b..8d0ef56d9 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ AntennaPod Feeds + Statistics Add Podcast PODCASTS Episodes @@ -34,6 +35,10 @@ Recently published Show only new Episodes + + Total time of podcasts played: + %1$d out of %2$d episodes started.\n\nPlayed %3$s out of %4$s. + Open menu Close menu @@ -135,6 +140,7 @@ Not downloaded Filtered {fa-exclamation-circle} Last Refresh failed + Open Podcast Download @@ -179,6 +185,7 @@ Connection Error Unknown Host Authentication Error + File Type Error Cancel all downloads Download canceled Download canceled\nDisabled Auto Download for this item @@ -279,8 +286,12 @@ There are no items in this list. You haven\'t subscribed to any feeds yet. This episode has no chapters. + This episode has no shownotes. + + Storage + Project Other About Queue @@ -359,6 +370,10 @@ Logout was successful Change login information Change the login information for your gpodder.net account. + Sync now + Sync subscriptions and episode states with gpodder.net + Sync started + %1$s with device %2$s]]> Playback Speeds Customize the speeds available for variable speed audio playback Fast forward time @@ -369,6 +384,8 @@ Always expand the notification to show playback buttons. Persistent Playback Controls Keep notification and lockscreen controls when playback is paused. + Show subscriptions + Show subscription list directly in navigation drawer Set Lockscreen Background Set the lockscreen background to the current episode\'s image. As a side effect, this will also show the image in third party apps. Show Download Report @@ -386,6 +403,11 @@ Sonic media player Use built-in sonic media player as a replacement for Android\'s native mediaplayer and Prestissimo Current value: %1$s + Proxy + Set a network proxy + FAQ + Known issues + No web browser found. Enable automatic flattring @@ -410,8 +432,8 @@ OPML Import ERROR! Reading OPML file - An error has occurred while reading the opml document: - The import directory is empty. + An error has occurred while reading the OPML document: + No file selected! Select all Deselect all Select… @@ -422,6 +444,7 @@ Export error OPML Export successful. The .opml file was written to:\u0020 + Access to external storage is required to read the OPML file Set sleep timer @@ -485,6 +508,7 @@ Create folder Choose Data Folder Please choose the base of your data folder. AntennaPod will create the appropriate sub-directories. + Access to external storage is required to change the data folder Create new folder with name "%1$s"? Created new folder Cannot write to this folder @@ -561,6 +585,10 @@ Selected downloaded Episodes Not downloaded Selected not downloaded Episodes + Queued + Selected queued Episodes + Not queued + Selected not queued Episodes Sort by… Title (A \u2192 Z) Title (Z \u2192 A) @@ -586,4 +614,17 @@ Downmix: Stereo to mono Sonic only + + Type + Host + Port + (Optional) + Test + Checking… + Test successful + Test failed + Host must not be empty + Host not valid IP address or domain + Port not valid + diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index eb2b6e12e..f7775a0bf 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -25,8 +25,6 @@ @drawable/ic_expand_more_grey600_36dp @drawable/ic_refresh_grey600_24dp @drawable/navigation_up - @drawable/ic_description_grey600_36dp - @drawable/ic_toc_grey600_36dp @drawable/ic_share_grey600_24dp @drawable/ic_list_grey600_24dp @drawable/ic_hearing_grey600_18dp @@ -37,7 +35,6 @@ @drawable/ic_drag_vertical_grey600_48dp @color/white @color/white - @drawable/ic_more_vert_grey600_24dp @drawable/ic_new_releases_grey600_24dp @drawable/ic_history_grey600_24dp @drawable/ic_folder_grey600_24dp @@ -58,10 +55,13 @@ @drawable/ic_check_box_outline_blank_grey600_24dp @drawable/ic_indeterminate_check_box_grey600_24dp @drawable/ic_sort_grey600_24dp + @drawable/ic_sd_storage_grey600_36dp + @drawable/ic_create_new_folder_grey600_24dp