diff options
Diffstat (limited to 'core/src')
16 files changed, 116 insertions, 77 deletions
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<Void, Integer, FlattrClickWorke public static enum ExitCode {EXIT_NORMAL, NO_TOKEN, NO_NETWORK, NO_THINGS} - private volatile int countFailed = 0; - private volatile int countSuccess = 0; + private final AtomicInteger countFailed = new AtomicInteger(); + private final AtomicInteger countSuccess = new AtomicInteger(); private volatile FlattrThing extraFlattrThing; @@ -114,12 +115,12 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke FlattrUtils.clickUrl(context, thing.getPaymentLink()); thing.getFlattrStatus().setFlattred(); publishProgress(R.string.flattr_click_success); - countSuccess++; + countSuccess.incrementAndGet(); } catch (FlattrException e) { e.printStackTrace(); - countFailed++; - if (countFailed == 1) { + int failed = countFailed.incrementAndGet(); + if (failed == 1) { exception = e; } } @@ -148,7 +149,7 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke super.onPostExecute(exitCode); switch (exitCode) { case EXIT_NORMAL: - if (countFailed > 0) { + if (countFailed.get() > 0) { postFlattrFailedNotification(); } break; @@ -190,7 +191,8 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke } private void postFlattrFailedNotification() { - if (countFailed == 0) { + int failed = countFailed.get(); + if (failed == 0) { return; } @@ -198,15 +200,15 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke String title; String subtext; - if (countFailed == 1) { + if (failed == 1) { title = context.getString(R.string.flattrd_failed_label); String exceptionMsg = (exception.getMessage() != null) ? exception.getMessage() : ""; subtext = context.getString(R.string.flattr_click_failure, extraFlattrThing.getTitle()) + "\n" + exceptionMsg; } else { title = context.getString(R.string.flattrd_label); - subtext = context.getString(R.string.flattr_click_success_count, countSuccess) + "\n" - + context.getString(R.string.flattr_click_failure_count, countFailed); + subtext = context.getString(R.string.flattr_click_success_count, countSuccess.get()) + "\n" + + context.getString(R.string.flattr_click_failure_count, failed); } Notification notification = new NotificationCompat.Builder(context) 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/GpodnetSyncService.java b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java index e7ebff154..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; @@ -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/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java index 7f40ea6e2..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 @@ -128,7 +128,8 @@ public class DownloadRequest implements Parcelable { DownloadRequest that = (DownloadRequest) o; - if (lastModified != that.lastModified) 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; 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 65ff8974c..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())); @@ -350,7 +350,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"); } @@ -556,7 +558,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 { @@ -609,7 +613,8 @@ public class DownloadService extends Service { .setSmallIcon(R.drawable.ic_stat_authentication) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_stat_authentication)) .setAutoCancel(true) - .setContentIntent(ClientConfig.downloadServiceCallbacks.getAuthentificationNotificationContentIntent(DownloadService.this, downloadRequest)); + .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); 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/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index d3a7fdee4..d3a5f576a 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 @@ -697,7 +697,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) { @@ -705,7 +705,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) { @@ -950,15 +950,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..."); 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..4f2400e1d 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; @@ -676,7 +677,7 @@ public final class DBReader { * as well as chapter marks of the FeedItems will also be loaded from the database. */ public static List<FeedItem> 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<FeedItem> items = getFeedItems(adapter, itemIds); 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 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/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; } 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..8d9151396 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,26 +36,32 @@ 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() ); } @@ -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 ="<html>" + + "<head>" + + "<style type='text/css'>" + + "html, body { margin: 0; padding: 0; width: 100%; height: 100%; } " + + "html { display: table; }" + + "body { display: table-cell; vertical-align: middle; text-align:center;" + + "-webkit-text-size-adjust: none; font-size: 87%; color: " + colorSecondaryString + ";} " + + "</style>" + + "</head>" + + "<body>" + + "<p>" + noShownotesLabel + "</p>" + + "</body>" + + "</html>"; + 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/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 @@ <string name="no_items_label">There are no items in this list.</string> <string name="no_feeds_label">You haven\'t subscribed to any feeds yet.</string> <string name="no_chapters_label">This episode has no chapters.</string> + <string name="no_shownotes_label">This episode has no shownotes.</string> + <!-- Preferences --> <string name="other_pref">Other</string> diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index c4a731a53..d79ba6b45 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -63,6 +63,7 @@ <style name="Theme.AntennaPod.Dark" parent="Theme.AppCompat"> <item name="colorAccent">@color/holo_blue_dark</item> + <item name="colorControlNormal">@color/white</item> <item name="buttonStyle">@style/Widget.AntennaPod.Button</item> <item name="progressBarTheme">@style/ProgressBarDark</item> <item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item> @@ -186,6 +187,7 @@ <item name="windowActionModeOverlay">true</item> <item name="progressBarTheme">@style/ProgressBarDark</item> <item name="colorAccent">@color/holo_blue_dark</item> + <item name="colorControlNormal">@color/white</item> <item name="buttonStyle">@style/Widget.AntennaPod.Button</item> <item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item> <item name="attr/action_about">@drawable/ic_info_white_24dp</item> |