summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java24
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java27
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java29
-rw-r--r--core/src/main/res/values/strings.xml6
8 files changed, 77 insertions, 29 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();
- }
}
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index d01159adf..7648f8867 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -13,7 +13,6 @@
<string name="favorite_episodes_label">Favorites</string>
<string name="new_label">New</string>
<string name="settings_label">Settings</string>
- <string name="add_new_feed_label">Add Podcast</string>
<string name="downloads_label">Downloads</string>
<string name="downloads_running_label">Running</string>
<string name="downloads_completed_label">Completed</string>
@@ -156,6 +155,7 @@
<string name="stream_label">Stream</string>
<string name="remove_label">Remove</string>
<string name="delete_label">Delete</string>
+ <string name="delete_failed">Unable to delete file. Rebooting the device could help.</string>
<string name="remove_episode_lable">Remove Episode</string>
<string name="marked_as_seen_label">Marked as seen</string>
<string name="mark_read_label">Mark as played</string>
@@ -320,6 +320,8 @@
<string name="pref_smart_mark_as_played_title">Smart Mark as Played</string>
<string name="pref_skip_keeps_episodes_sum">Keep episodes when they are skipped</string>
<string name="pref_skip_keeps_episodes_title">Keep Skipped Episodes</string>
+ <string name="pref_favorite_keeps_episodes_sum">Keep episodes when they are marked Favorite</string>
+ <string name="pref_favorite_keeps_episodes_title">Keep Favorite Episodes</string>
<string name="playback_pref">Playback</string>
<string name="network_pref">Network</string>
<string name="pref_autoUpdateIntervallOrTime_title">Update Interval or Time of Day</string>
@@ -432,7 +434,7 @@
<string name="pref_cast_title">Chromecast support</string>
<string name="pref_cast_message_play_flavor">Enable support for remote media playback on Cast devices (such as Chromecast, Audio Speakers or Android TV)</string>
<string name="pref_cast_message_free_flavor">Chromecast requires third party proprietary libraries that are disabled in this version of AntennaPod</string>
- <string name="pref_enqueue_downloaded_title">Enqueue Dowloaded</string>
+ <string name="pref_enqueue_downloaded_title">Enqueue Downloaded</string>
<string name="pref_enqueue_downloaded_summary">Add downloaded episodes to the queue</string>
<!-- Auto-Flattr dialog -->