diff options
Diffstat (limited to 'src/de/danoeh/antennapod')
6 files changed, 222 insertions, 29 deletions
diff --git a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java index f43f29db3..a84e5b8f2 100644 --- a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -10,6 +10,7 @@ import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; +import android.view.View.OnLongClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageButton; @@ -24,11 +25,13 @@ import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.ChapterListAdapter; import de.danoeh.antennapod.asynctask.ImageLoader; +import de.danoeh.antennapod.dialog.VariableSpeedDialog; import de.danoeh.antennapod.feed.Chapter; import de.danoeh.antennapod.feed.MediaType; import de.danoeh.antennapod.feed.SimpleChapter; import de.danoeh.antennapod.fragment.CoverFragment; import de.danoeh.antennapod.fragment.ItemDescriptionFragment; +import de.danoeh.antennapod.preferences.UserPreferences; import de.danoeh.antennapod.service.PlaybackService; import de.danoeh.antennapod.util.playback.ExternalMedia; import de.danoeh.antennapod.util.playback.Playable; @@ -400,27 +403,45 @@ public class AudioplayerActivity extends MediaplayerActivity { @Override public void onClick(View v) { - final double PLAYBACK_SPEED_STEP = 0.5; - final double PLAYBACK_SPEED_MAX = 2.0; - final double PLAYBACK_SPEED_DEFAULT = 1.0; - if (controller != null && controller.canSetPlaybackSpeed()) { - double currentPlaybackSpeed = controller - .getCurrentPlaybackSpeedMultiplier(); - if (currentPlaybackSpeed != -1) { - if (currentPlaybackSpeed >= PLAYBACK_SPEED_MAX) { - controller.setPlaybackSpeed(PLAYBACK_SPEED_DEFAULT); - } else { - controller.setPlaybackSpeed(currentPlaybackSpeed - + PLAYBACK_SPEED_STEP); - } + String[] availableSpeeds = UserPreferences + .getPlaybackSpeedArray(); + String currentSpeed = UserPreferences.getPlaybackSpeed(); + + // Provide initial value in case the speed list has changed + // out from under us + // and our current speed isn't in the new list + String newSpeed; + if (availableSpeeds.length > 0) { + newSpeed = availableSpeeds[0]; } else { - controller.setPlaybackSpeed(PLAYBACK_SPEED_DEFAULT); + newSpeed = "1.0"; } + for (int i = 0; i < availableSpeeds.length; i++) { + if (availableSpeeds[i].equals(currentSpeed)) { + if (i == availableSpeeds.length - 1) { + newSpeed = availableSpeeds[0]; + } else { + newSpeed = availableSpeeds[i + 1]; + } + break; + } + } + UserPreferences.setPlaybackSpeed(AudioplayerActivity.this, + newSpeed); + controller.setPlaybackSpeed(Float.parseFloat(newSpeed)); } } }); + + butPlaybackSpeed.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + VariableSpeedDialog.showDialog(AudioplayerActivity.this); + return true; + } + }); } @Override @@ -430,14 +451,12 @@ public class AudioplayerActivity extends MediaplayerActivity { } private void updateButPlaybackSpeed() { - double playbackSpeed; if (controller == null - || (playbackSpeed = controller - .getCurrentPlaybackSpeedMultiplier()) == -1) { + || (controller.getCurrentPlaybackSpeedMultiplier() == -1)) { butPlaybackSpeed.setVisibility(View.GONE); } else { butPlaybackSpeed.setVisibility(View.VISIBLE); - butPlaybackSpeed.setText(String.format("%.1fx", playbackSpeed)); + butPlaybackSpeed.setText(UserPreferences.getPlaybackSpeed()); } } diff --git a/src/de/danoeh/antennapod/activity/PreferenceActivity.java b/src/de/danoeh/antennapod/activity/PreferenceActivity.java index 9fcf57ac2..373fbdf99 100644 --- a/src/de/danoeh/antennapod/activity/PreferenceActivity.java +++ b/src/de/danoeh/antennapod/activity/PreferenceActivity.java @@ -27,6 +27,7 @@ import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.R; import de.danoeh.antennapod.asynctask.FlattrClickWorker; import de.danoeh.antennapod.asynctask.OpmlExportWorker; +import de.danoeh.antennapod.dialog.VariableSpeedDialog; import de.danoeh.antennapod.feed.FeedManager; import de.danoeh.antennapod.preferences.UserPreferences; import de.danoeh.antennapod.util.flattr.FlattrUtils; @@ -42,6 +43,7 @@ public class PreferenceActivity extends SherlockPreferenceActivity { private static final String PREF_ABOUT = "prefAbout"; private static final String PREF_CHOOSE_DATA_DIR = "prefChooseDataDir"; private static final String AUTO_DL_PREF_SCREEN = "prefAutoDownloadSettings"; + private static final String PREF_PLAYBACK_SPEED_LAUNCHER = "prefPlaybackSpeedLauncher"; private CheckBoxPreference[] selectedNetworks; @@ -167,6 +169,14 @@ public class PreferenceActivity extends SherlockPreferenceActivity { return true; } }); + findPreference(PREF_PLAYBACK_SPEED_LAUNCHER) + .setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + VariableSpeedDialog.showDialog(PreferenceActivity.this); + return true; + } + }); buildUpdateIntervalPreference(); buildAutodownloadSelectedNetworsPreference(); setSelectedNetworksEnabled(UserPreferences diff --git a/src/de/danoeh/antennapod/dialog/VariableSpeedDialog.java b/src/de/danoeh/antennapod/dialog/VariableSpeedDialog.java new file mode 100644 index 000000000..308235f95 --- /dev/null +++ b/src/de/danoeh/antennapod/dialog/VariableSpeedDialog.java @@ -0,0 +1,95 @@ +package de.danoeh.antennapod.dialog; + +import java.util.Arrays; +import java.util.List; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.preferences.UserPreferences; + +public class VariableSpeedDialog { + private VariableSpeedDialog() { + } + + public static void showDialog(final Context context) { + if (com.aocate.media.MediaPlayer.isPrestoLibraryInstalled(context)) { + showSpeedSelectorDialog(context); + } else { + showGetPluginDialog(context); + } + } + + private static void showGetPluginDialog(final Context context) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.no_playback_plugin_title); + builder.setMessage(R.string.no_playback_plugin_msg); + builder.setNegativeButton(R.string.close_label, null); + builder.setPositiveButton(R.string.download_plugin_label, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent playStoreIntent = new Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=com.falconware.prestissimo")); + context.startActivity(playStoreIntent); + } + }); + builder.create().show(); + } + + private static void showSpeedSelectorDialog(final Context context) { + final String[] speedValues = context.getResources().getStringArray( + R.array.playback_speed_values); + // According to Java spec these get initialized to false on creation + final boolean[] speedChecked = new boolean[speedValues.length]; + + // Build the "isChecked" array so that multiChoice dialog is + // populated correctly + List<String> selectedSpeedList = Arrays.asList(UserPreferences + .getPlaybackSpeedArray()); + for (int i = 0; i < speedValues.length; i++) { + speedChecked[i] = selectedSpeedList.contains(speedValues[i]); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.set_playback_speed_label); + builder.setMultiChoiceItems(R.array.playback_speed_values, + speedChecked, new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, + boolean isChecked) { + speedChecked[which] = isChecked; + } + + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int choiceCount = 0; + for (int i = 0; i < speedChecked.length; i++) { + if (speedChecked[i]) { + choiceCount++; + } + } + String[] newSpeedValues = new String[choiceCount]; + int newSpeedIndex = 0; + for (int i = 0; i < speedChecked.length; i++) { + if (speedChecked[i]) { + newSpeedValues[newSpeedIndex++] = speedValues[i]; + } + } + + UserPreferences.setPlaybackSpeedArray(context, + newSpeedValues); + + } + }); + builder.create().show(); + } +} diff --git a/src/de/danoeh/antennapod/preferences/UserPreferences.java b/src/de/danoeh/antennapod/preferences/UserPreferences.java index f2f35f41d..b2c1927b4 100644 --- a/src/de/danoeh/antennapod/preferences/UserPreferences.java +++ b/src/de/danoeh/antennapod/preferences/UserPreferences.java @@ -5,6 +5,8 @@ import java.io.IOException; import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.StringUtils; +import org.json.JSONArray; +import org.json.JSONException; import android.app.AlarmManager; import android.app.PendingIntent; @@ -41,11 +43,13 @@ public class UserPreferences implements public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter"; private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks"; public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize"; + private static final String PREF_PLAYBACK_SPEED = "prefPlaybackSpeed"; + private static final String PREF_PLAYBACK_SPEED_ARRAY = "prefPlaybackSpeedArray"; private static int EPISODE_CACHE_SIZE_UNLIMITED = -1; private static UserPreferences instance; - private Context context; + private final Context context; // Preferences private boolean pauseOnHeadsetDisconnect; @@ -60,6 +64,8 @@ public class UserPreferences implements private boolean enableAutodownloadWifiFilter; private String[] autodownloadSelectedNetworks; private int episodeCacheSize; + private String playbackSpeed; + private String[] playbackSpeedArray; private UserPreferences(Context context) { this.context = context; @@ -108,6 +114,9 @@ public class UserPreferences implements episodeCacheSize = readEpisodeCacheSize(sp.getString( PREF_EPISODE_CACHE_SIZE, "20")); enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false); + playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0"); + playbackSpeedArray = readPlaybackSpeedArray(sp.getString( + PREF_PLAYBACK_SPEED_ARRAY, null)); } private int readThemeValue(String valueFromPrefs) { @@ -135,6 +144,28 @@ public class UserPreferences implements } } + private String[] readPlaybackSpeedArray(String valueFromPrefs) { + String[] playbackSpeeds = null; + // If this preference hasn't been set yet, return all options + if (valueFromPrefs == null) { + playbackSpeeds = context.getResources().getStringArray( + R.array.playback_speed_values); + } else { + try { + JSONArray jsonArray = new JSONArray(valueFromPrefs); + playbackSpeeds = new String[jsonArray.length()]; + for (int i = 0; i < jsonArray.length(); i++) { + playbackSpeeds[i] = jsonArray.getString(i); + } + } catch (JSONException e) { + Log.e(TAG, + "Got JSON error when trying to get speeds from JSONArray"); + e.printStackTrace(); + } + } + return playbackSpeeds; + } + private static void instanceAvailable() { if (instance == null) { throw new IllegalStateException( @@ -196,6 +227,16 @@ public class UserPreferences implements return EPISODE_CACHE_SIZE_UNLIMITED; } + public static String getPlaybackSpeed() { + instanceAvailable(); + return instance.playbackSpeed; + } + + public static String[] getPlaybackSpeedArray() { + instanceAvailable(); + return instance.playbackSpeedArray; + } + /** * Returns the capacity of the episode cache. This method will return the * negative integer EPISODE_CACHE_SIZE_UNLIMITED if the cache size is set to @@ -250,7 +291,32 @@ public class UserPreferences implements PREF_EPISODE_CACHE_SIZE, "20")); } else if (key.equals(PREF_ENABLE_AUTODL)) { enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false); + } else if (key.equals(PREF_PLAYBACK_SPEED)) { + playbackSpeed = sp.getString(PREF_PLAYBACK_SPEED, "1.0"); + } else if (key.equals(PREF_PLAYBACK_SPEED_ARRAY)) { + playbackSpeedArray = readPlaybackSpeedArray(sp.getString( + PREF_PLAYBACK_SPEED_ARRAY, null)); + } + } + + public static void setPlaybackSpeed(Context context, String speed) { + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(context.getApplicationContext()); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(PREF_PLAYBACK_SPEED, speed); + editor.apply(); + } + + public static void setPlaybackSpeedArray(Context context, String[] speeds) { + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(context.getApplicationContext()); + SharedPreferences.Editor editor = prefs.edit(); + JSONArray jsonArray = new JSONArray(); + for (String speed : speeds) { + jsonArray.put(speed); } + editor.putString(PREF_PLAYBACK_SPEED_ARRAY, jsonArray.toString()); + editor.apply(); } public static void setAutodownloadSelectedNetworks(Context context, diff --git a/src/de/danoeh/antennapod/service/PlaybackService.java b/src/de/danoeh/antennapod/service/PlaybackService.java index 6c7619476..302d532b2 100644 --- a/src/de/danoeh/antennapod/service/PlaybackService.java +++ b/src/de/danoeh/antennapod/service/PlaybackService.java @@ -422,6 +422,7 @@ public class PlaybackService extends Service { stopSelf(); } } + return Service.START_NOT_STICKY; } @@ -979,6 +980,7 @@ public class PlaybackService extends Service { Log.d(TAG, "Resuming/Starting playback"); writePlaybackPreferences(); + setSpeed(Float.parseFloat(UserPreferences.getPlaybackSpeed())); player.start(); if (status != PlayerStatus.PAUSED) { player.seekTo(media.getPosition()); @@ -1537,11 +1539,11 @@ public class PlaybackService extends Service { return false; } - public void setSpeed(double speed) { + public void setSpeed(float speed) { if (media != null && media.getMediaType() == MediaType.AUDIO) { AudioPlayer audioPlayer = (AudioPlayer) player; if (audioPlayer.canSetSpeed()) { - audioPlayer.setPlaybackSpeed((float) speed); + audioPlayer.setPlaybackSpeed(speed); if (AppConfig.DEBUG) Log.d(TAG, "Playback speed was set to " + speed); sendNotificationBroadcast( @@ -1550,16 +1552,16 @@ public class PlaybackService extends Service { } } - public void setPitch(double pitch) { + public void setPitch(float pitch) { if (media != null && media.getMediaType() == MediaType.AUDIO) { AudioPlayer audioPlayer = (AudioPlayer) player; if (audioPlayer.canSetPitch()) { - audioPlayer.setPlaybackPitch((float) pitch); + audioPlayer.setPlaybackPitch(pitch); } } } - public double getCurrentPlaybackSpeed() { + public float getCurrentPlaybackSpeed() { if (media.getMediaType() == MediaType.AUDIO && player instanceof AudioPlayer) { AudioPlayer audioPlayer = (AudioPlayer) player; diff --git a/src/de/danoeh/antennapod/util/playback/PlaybackController.java b/src/de/danoeh/antennapod/util/playback/PlaybackController.java index 0060c756f..b15c3d2b0 100644 --- a/src/de/danoeh/antennapod/util/playback/PlaybackController.java +++ b/src/de/danoeh/antennapod/util/playback/PlaybackController.java @@ -255,7 +255,8 @@ public abstract class PlaybackController { public abstract void onPositionObserverUpdate(); - private ServiceConnection mConnection = new ServiceConnection() { + private final ServiceConnection mConnection = new ServiceConnection() { + @Override public void onServiceConnected(ComponentName className, IBinder service) { playbackService = ((PlaybackService.LocalBinder) service) .getService(); @@ -343,7 +344,7 @@ public abstract class PlaybackController { }; - private BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { + private final BroadcastReceiver shutdownReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -356,7 +357,7 @@ public abstract class PlaybackController { } } }; - + public abstract void onPlaybackSpeedChange(); public abstract void onShutdownNotification(); @@ -662,13 +663,13 @@ public abstract class PlaybackController { return playbackService != null && playbackService.canSetSpeed(); } - public void setPlaybackSpeed(double speed) { + public void setPlaybackSpeed(float speed) { if (playbackService != null) { playbackService.setSpeed(speed); } } - public double getCurrentPlaybackSpeedMultiplier() { + public float getCurrentPlaybackSpeedMultiplier() { if (canSetPlaybackSpeed()) { return playbackService.getCurrentPlaybackSpeed(); } else { |