diff options
Diffstat (limited to 'core/src/main/java')
7 files changed, 73 insertions, 27 deletions
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 036978bf9..20a349055 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 @@ -67,6 +67,7 @@ public class UserPreferences { public static final String PREF_HARDWARE_PREVIOUS_BUTTON_RESTARTS = "prefHardwarePreviousButtonRestarts"; public static final String PREF_FOLLOW_QUEUE = "prefFollowQueue"; public static final String PREF_SKIP_KEEPS_EPISODE = "prefSkipKeepsEpisode"; + public static final String PREF_FAVORITE_KEEPS_EPISODE = "prefFavoriteKeepsEpisode"; public static final String PREF_AUTO_DELETE = "prefAutoDelete"; public static final String PREF_SMART_MARK_AS_PLAYED_SECS = "prefSmartMarkAsPlayedSecs"; public static final String PREF_PLAYBACK_SPEED_ARRAY = "prefPlaybackSpeedArray"; @@ -296,6 +297,10 @@ public class UserPreferences { public static boolean shouldSkipKeepEpisode() { return prefs.getBoolean(PREF_SKIP_KEEPS_EPISODE, true); } + public static boolean shouldFavoriteKeepEpisode() { + return prefs.getBoolean(PREF_FAVORITE_KEEPS_EPISODE, true); + } + public static boolean isAutoDelete() { return prefs.getBoolean(PREF_AUTO_DELETE, false); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index f395dfb32..11cd21db5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -300,7 +300,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { /** * Called after media player has been prepared. This method is executed on the caller's thread. */ - void onPrepared(final boolean startWhenPrepared) { + private void onPrepared(final boolean startWhenPrepared) { playerLock.lock(); if (playerStatus != PlayerStatus.PREPARING) { @@ -688,18 +688,22 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { media = playable; } - private IPlayer createMediaPlayer() { + private void createMediaPlayer() { if (mediaPlayer != null) { mediaPlayer.release(); } - if (media == null || media.getMediaType() == MediaType.VIDEO) { + if(media == null) { + mediaPlayer = null; + return; + } + if (media.getMediaType() == MediaType.VIDEO) { mediaPlayer = new VideoPlayer(); } else { mediaPlayer = new AudioPlayer(context); } mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); - return setMediaPlayerListeners(mediaPlayer); + setMediaPlayerListeners(mediaPlayer); } private final AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() { @@ -855,14 +859,20 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (mp == null || media == null) { return mp; } - if (media.getMediaType() == MediaType.VIDEO) { + if (mp instanceof VideoPlayer) { + if (media.getMediaType() != MediaType.VIDEO) { + Log.w(TAG, "video player, but media type is " + media.getMediaType()); + } VideoPlayer vp = (VideoPlayer) mp; vp.setOnCompletionListener(videoCompletionListener); vp.setOnSeekCompleteListener(videoSeekCompleteListener); vp.setOnErrorListener(videoErrorListener); vp.setOnBufferingUpdateListener(videoBufferingUpdateListener); vp.setOnInfoListener(videoInfoListener); - } else { + } else if (mp instanceof AudioPlayer) { + if (media.getMediaType() != MediaType.AUDIO) { + Log.w(TAG, "audio player, but media type is " + media.getMediaType()); + } AudioPlayer ap = (AudioPlayer) mp; ap.setOnCompletionListener(audioCompletionListener); ap.setOnSeekCompleteListener(audioSeekCompleteListener); @@ -870,6 +880,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { ap.setOnBufferingUpdateListener(audioBufferingUpdateListener); ap.setOnInfoListener(audioInfoListener); ap.setOnSpeedAdjustmentAvailableChangedListener(audioSetSpeedAbilityListener); + } else { + Log.w(TAG, "Unknown media player: " + mp); } return mp; } 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 c3e6b55ba..b8ab70ed4 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 @@ -133,6 +133,12 @@ public class PlaybackService extends MediaBrowserServiceCompat { */ public static final String ACTION_RESUME_PLAY_CURRENT_EPISODE = "action.de.danoeh.antennapod.core.service.resumePlayCurrentEpisode"; + /** + * Custom action used by Android Wear + */ + private static final String CUSTOM_ACTION_FAST_FORWARD = "action.de.danoeh.antennapod.core.service.fastForward"; + private static final String CUSTOM_ACTION_REWIND = "action.de.danoeh.antennapod.core.service.rewind"; + /** * Used in NOTIFICATION_TYPE_RELOAD. @@ -886,7 +892,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { // isInQueue remains false } // Delete episode if enabled - if (item.getFeed().getPreferences().getCurrentAutoDelete()) { + if (item.getFeed().getPreferences().getCurrentAutoDelete() && + !(item.isTagged(FeedItem.TAG_FAVORITE) && UserPreferences.shouldFavoriteKeepEpisode())) { DBWriter.deleteFeedMediaOfItem(PlaybackService.this, media.getId()); Log.d(TAG, "Episode Deleted"); } @@ -1083,6 +1090,14 @@ public class PlaybackService extends MediaBrowserServiceCompat { } sessionState.setActions(capabilities); + + flavorHelper.sessionStateAddActionForWear(sessionState, + CUSTOM_ACTION_REWIND, getString(R.string.rewind_label), android.R.drawable.ic_media_rew); + flavorHelper.sessionStateAddActionForWear(sessionState, + CUSTOM_ACTION_FAST_FORWARD, getString(R.string.fast_forward_label), android.R.drawable.ic_media_ff); + + flavorHelper.mediaSessionSetExtraForWear(mediaSession); + mediaSession.setPlaybackState(sessionState.build()); } @@ -1761,6 +1776,16 @@ public class PlaybackService extends MediaBrowserServiceCompat { } return false; } + + @Override + public void onCustomAction(String action, Bundle extra) { + Log.d(TAG, "onCustomAction(" + action + ")"); + if (CUSTOM_ACTION_FAST_FORWARD.equals(action)) { + onFastForward(); + } else if (CUSTOM_ACTION_REWIND.equals(action)) { + onRewind(); + } + } }; private SharedPreferences.OnSharedPreferenceChangeListener prefListener = 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 4bec03d7e..a2ecd0a52 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 @@ -905,6 +905,7 @@ public final class DBReader { Cursor cursor = adapter.getImageCursor(ids); int imageCount = cursor.getCount(); if (imageCount == 0) { + cursor.close(); return Collections.emptyMap(); } Map<Long, FeedImage> result = new ArrayMap<>(imageCount); 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 563d80da0..49ec07004 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 @@ -7,6 +7,8 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; +import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.core.event.MessageEvent; import org.shredzone.flattr4j.model.Flattr; import java.io.File; @@ -84,12 +86,13 @@ public class DBWriter { if (media != null) { Log.i(TAG, String.format("Requested to delete FeedMedia [id=%d, title=%s, downloaded=%s", media.getId(), media.getEpisodeTitle(), String.valueOf(media.isDownloaded()))); - boolean result = false; if (media.isDownloaded()) { // delete downloaded media file File mediaFile = new File(media.getFile_url()); - if (mediaFile.exists()) { - result = mediaFile.delete(); + if (mediaFile.exists() && !mediaFile.delete()) { + MessageEvent evt = new MessageEvent(context.getString(R.string.delete_failed)); + EventBus.getDefault().post(evt); + return; } media.setDownloaded(false); media.setFile_url(null); @@ -129,7 +132,6 @@ public class DBWriter { GpodnetPreferences.enqueueEpisodeAction(action); } } - Log.d(TAG, "Deleting File. Result: " + result); EventBus.getDefault().post(FeedItemEvent.deletedMedia(Collections.singletonList(media.getItem()))); EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast(); } 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 04afc504b..7051d7f4d 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 @@ -345,9 +345,7 @@ public class DownloadRequester { // Try to generate the filename by the item title if (media.getItem() != null && media.getItem().getTitle() != null) { String title = media.getItem().getTitle(); - // Delete reserved characters - titleBaseFilename = title.replaceAll("[^a-zA-Z0-9 ._()-]", ""); - titleBaseFilename = titleBaseFilename.trim(); + titleBaseFilename = FileNameGenerator.generateFileName(title); } String URLBaseFilename = URLUtil.guessFileName(media.getDownload_url(), diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java index 30c2e62f2..8da176c82 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java @@ -1,18 +1,21 @@ package de.danoeh.antennapod.core.util; +import org.apache.commons.lang3.ArrayUtils; + import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** Generates valid filenames for a given string. */ public class FileNameGenerator { - private static final char[] ILLEGAL_CHARACTERS = { '/', '\\', '?', '%', - '*', ':', '|', '"', '<', '>', '\n' }; - static { - Arrays.sort(ILLEGAL_CHARACTERS); - } + private static final char[] validChars = ( + "abcdefghijklmnopqrstuvwxyz" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + "0123456789" + + " _-").toCharArray(); private FileNameGenerator() { - } /** @@ -20,17 +23,17 @@ public class FileNameGenerator { * characters of the given string. */ public static String generateFileName(String string) { - StringBuilder builder = new StringBuilder(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); - if (Arrays.binarySearch(ILLEGAL_CHARACTERS, c) < 0) { - builder.append(c); + if(Character.isSpaceChar(c) && (buf.length() == 0 || Character.isSpaceChar(buf.charAt(buf.length()-1)))) { + continue; + } + if (ArrayUtils.contains(validChars, c)) { + buf.append(c); } } - return builder.toString().replaceFirst(" *$",""); + return buf.toString().trim(); } - public static long generateLong(final String str) { - return str.hashCode(); - } } |