diff options
16 files changed, 97 insertions, 343 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java index 195891499..3186cbe2e 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java @@ -10,11 +10,9 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import android.widget.Button; import android.widget.CheckBox; -import android.widget.SeekBar; import android.widget.TextView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.playback.PlaybackController; import de.danoeh.antennapod.view.PlaybackSpeedSeekBar; @@ -63,11 +61,7 @@ public class PlaybackControlsDialog extends DialogFragment { dialog = new AlertDialog.Builder(getContext()) .setTitle(R.string.audio_controls) .setView(R.layout.audio_controls) - .setPositiveButton(R.string.close_label, (dialog1, which) -> { - final SeekBar left = dialog.findViewById(R.id.volume_left); - final SeekBar right = dialog.findViewById(R.id.volume_right); - UserPreferences.setVolume(left.getProgress(), right.getProgress()); - }).create(); + .setPositiveButton(R.string.close_label, null).create(); return dialog; } @@ -79,10 +73,6 @@ public class PlaybackControlsDialog extends DialogFragment { speedSeekBar.setProgressChangedListener(speed -> txtvPlaybackSpeed.setText(String.format(Locale.getDefault(), "%.2fx", speed))); - final SeekBar barLeftVolume = dialog.findViewById(R.id.volume_left); - barLeftVolume.setProgress(UserPreferences.getLeftVolumePercentage()); - final SeekBar barRightVolume = dialog.findViewById(R.id.volume_right); - barRightVolume.setProgress(UserPreferences.getRightVolumePercentage()); final CheckBox stereoToMono = dialog.findViewById(R.id.stereo_to_mono); stereoToMono.setChecked(UserPreferences.stereoToMono()); if (controller != null && !controller.canDownmix()) { @@ -91,10 +81,6 @@ public class PlaybackControlsDialog extends DialogFragment { stereoToMono.setText(getString(R.string.stereo_to_mono) + " [" + sonicOnly + "]"); } - if (UserPreferences.useExoplayer()) { - barRightVolume.setEnabled(false); - } - final CheckBox skipSilence = dialog.findViewById(R.id.skipSilence); skipSilence.setChecked(UserPreferences.isSkipSilence()); if (!UserPreferences.useExoplayer()) { @@ -106,39 +92,6 @@ public class PlaybackControlsDialog extends DialogFragment { UserPreferences.setSkipSilence(isChecked); controller.setSkipSilence(isChecked); }); - - barLeftVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - controller.setVolume( - Converter.getVolumeFromPercentage(progress), - Converter.getVolumeFromPercentage(barRightVolume.getProgress())); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - barRightVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - controller.setVolume( - Converter.getVolumeFromPercentage(barLeftVolume.getProgress()), - Converter.getVolumeFromPercentage(progress)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); stereoToMono.setOnCheckedChangeListener((buttonView, isChecked) -> { UserPreferences.stereoToMono(isChecked); if (controller != null) { diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java index fa5c2d8c3..691bd65e8 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java @@ -153,10 +153,13 @@ public class SleepTimerDialog extends DialogFragment { return; } try { + long time = Long.parseLong(etxtTime.getText().toString()); + if (time == 0) { + throw new NumberFormatException("Timer must not be zero"); + } SleepTimerPreferences.setLastTimer(etxtTime.getText().toString(), spTimeUnit.getSelectedItemPosition()); - long time = SleepTimerPreferences.timerMillis(); if (controller != null) { - controller.setSleepTimer(time); + controller.setSleepTimer(SleepTimerPreferences.timerMillis()); } closeKeyboard(content); } catch (NumberFormatException e) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/StoragePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/StoragePreferencesFragment.java index 42b0cb96f..e5617b8ea 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/StoragePreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/StoragePreferencesFragment.java @@ -1,7 +1,6 @@ package de.danoeh.antennapod.fragment.preferences; import android.os.Bundle; -import androidx.appcompat.app.AlertDialog; import androidx.preference.PreferenceFragmentCompat; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.PreferenceActivity; @@ -43,22 +42,6 @@ public class StoragePreferencesFragment extends PreferenceFragmentCompat { return true; } ); - findPreference(UserPreferences.PREF_IMAGE_CACHE_SIZE).setOnPreferenceChangeListener( - (preference, o) -> { - if (o instanceof String) { - int newValue = Integer.parseInt((String) o) * 1024 * 1024; - if (newValue != UserPreferences.getImageCacheSize()) { - AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity()); - dialog.setTitle(android.R.string.dialog_alert_title); - dialog.setMessage(R.string.pref_restart_required); - dialog.setPositiveButton(android.R.string.ok, null); - dialog.show(); - } - return true; - } - return false; - } - ); findPreference(PREF_IMPORT_EXPORT).setOnPreferenceClickListener( preference -> { ((PreferenceActivity) getActivity()).openScreen(R.xml.preferences_import_export); diff --git a/app/src/main/res/layout/audio_controls.xml b/app/src/main/res/layout/audio_controls.xml index 2c9665aad..0bfa4f521 100644 --- a/app/src/main/res/layout/audio_controls.xml +++ b/app/src/main/res/layout/audio_controls.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" + android:orientation="vertical" android:padding="16dp"> <LinearLayout @@ -17,7 +17,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" - android:layout_marginBottom="8dp"/> + android:layout_marginBottom="8dp" /> <LinearLayout android:layout_width="match_parent" @@ -27,9 +27,9 @@ <TextView android:layout_width="0dp" android:layout_height="wrap_content" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" android:layout_weight="1" - android:text="@string/playback_speed" /> + android:text="@string/playback_speed" + style="@style/AntennaPod.TextView.ListItemPrimaryTitle" /> <TextView android:id="@+id/txtvPlaybackSpeed" @@ -42,67 +42,14 @@ <de.danoeh.antennapod.view.PlaybackSpeedSeekBar android:id="@+id/speed_seek_bar" android:layout_width="match_parent" - android:layout_height="wrap_content"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:layout_marginBottom="4dp" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" - android:text="@string/volume" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginStart="8dp" - android:orientation="horizontal" - android:gravity="center"> - - <TextView - android:id="@+id/txtvLeft" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/left_short" /> - - <SeekBar - android:id="@+id/volume_left" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:max="100" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginLeft="8dp" - android:layout_marginStart="8dp" - android:orientation="horizontal" - android:gravity="center"> - - <TextView - android:id="@+id/txtvRight" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/right_short" /> - - <SeekBar - android:id="@+id/volume_right" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:max="100" /> - - </LinearLayout> + android:layout_height="wrap_content" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" - android:text="@string/audio_effects" /> + android:text="@string/audio_effects" + style="@style/AntennaPod.TextView.ListItemPrimaryTitle" /> <CheckBox android:id="@+id/skipSilence" @@ -115,5 +62,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/stereo_to_mono" /> + </LinearLayout> + </ScrollView> diff --git a/app/src/main/res/layout/episode_filter_dialog.xml b/app/src/main/res/layout/episode_filter_dialog.xml index 43d074bfb..9661a8e72 100644 --- a/app/src/main/res/layout/episode_filter_dialog.xml +++ b/app/src/main/res/layout/episode_filter_dialog.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" @@ -7,7 +8,7 @@ <RadioGroup android:id="@+id/radio_filter_group" - android:layout_width="fill_parent" + android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> @@ -22,19 +23,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/episode_filters_exclude" /> + </RadioGroup> <EditText android:id="@+id/etxtEpisodeFilterText" - android:layout_width="fill_parent" + android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" - android:lines="8" - android:minLines="1" - android:maxLines="20" - android:scrollbars="vertical" - android:hint="@string/episode_filters_hint" + android:cursorVisible="true" android:focusable="true" android:focusableInTouchMode="true" - android:cursorVisible="true" /> + android:hint="@string/episode_filters_hint" + android:lines="8" + android:maxLines="20" + android:minLines="1" + android:scrollbars="vertical" /> + </LinearLayout> diff --git a/app/src/main/res/layout/subscription_item.xml b/app/src/main/res/layout/subscription_item.xml index 7fa738f12..ec918fdac 100644 --- a/app/src/main/res/layout/subscription_item.xml +++ b/app/src/main/res/layout/subscription_item.xml @@ -2,32 +2,32 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" xmlns:squareImageView="http://schemas.android.com/apk/de.danoeh.antennapod" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:foreground="?attr/selectableItemBackground"> <de.danoeh.antennapod.ui.common.SquareImageView android:id="@+id/imgvCover" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:scaleType="fitCenter" + android:layout_width="match_parent" + android:layout_height="match_parent" android:background="@color/non_square_icon_background" - tools:src="@mipmap/ic_launcher_round" - squareImageView:direction="width"/> + android:scaleType="fitCenter" + squareImageView:direction="width" + tools:src="@mipmap/ic_launcher_round" /> <com.joanzapata.iconify.widget.IconTextView android:id="@+id/txtvTitle" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/non_square_icon_background" - android:layout_alignLeft="@+id/imgvCover" - android:layout_alignRight="@+id/imgvCover" android:layout_alignStart="@+id/imgvCover" - android:layout_alignEnd="@+id/imgvCover" + android:layout_alignLeft="@+id/imgvCover" android:layout_alignTop="@+id/imgvCover" + android:layout_alignEnd="@+id/imgvCover" + android:layout_alignRight="@+id/imgvCover" android:layout_alignBottom="@+id/imgvCover" + android:background="@color/non_square_icon_background" android:ellipsize="end" android:gravity="center" android:textColor="?android:attr/textColorPrimary" @@ -37,12 +37,13 @@ android:id="@+id/triangleCountView" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_alignParentRight="true" - android:layout_alignParentEnd="true" android:layout_alignParentTop="true" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" app:backgroundColor="?attr/colorSecondary" app:corner="rightTop" app:primaryText="Test" app:primaryTextColor="?attr/colorOnSecondary" app:primaryTextSize="12sp" /> + </RelativeLayout> diff --git a/app/src/main/res/xml/preferences_storage.xml b/app/src/main/res/xml/preferences_storage.xml index d3d570e6c..89e8c4cf5 100644 --- a/app/src/main/res/xml/preferences_storage.xml +++ b/app/src/main/res/xml/preferences_storage.xml @@ -6,13 +6,6 @@ <Preference android:title="@string/choose_data_directory" android:key="prefChooseDataDir"/> - <ListPreference - android:entryValues="@array/image_cache_size_values" - android:entries="@array/image_cache_size_options" - android:title="@string/pref_image_cache_size_title" - android:key="prefImageCacheSize" - android:summary="@string/pref_image_cache_size_sum" - android:defaultValue="100"/> <SwitchPreferenceCompat android:defaultValue="false" android:enabled="true" diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java index b3adc567e..8ad04cb47 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java @@ -1,6 +1,8 @@ package de.danoeh.antennapod.core.glide; +import android.annotation.SuppressLint; import android.content.Context; +import android.util.Log; import androidx.annotation.NonNull; import com.bumptech.glide.Glide; @@ -16,7 +18,6 @@ import de.danoeh.antennapod.core.util.EmbeddedChapterImage; import java.io.InputStream; import com.bumptech.glide.request.RequestOptions; -import de.danoeh.antennapod.core.preferences.UserPreferences; import java.nio.ByteBuffer; /** @@ -24,12 +25,18 @@ import java.nio.ByteBuffer; */ @GlideModule public class ApGlideModule extends AppGlideModule { + private static final String TAG = "ApGlideModule"; + private static final long MEGABYTES = 1024 * 1024; + private static final long GIGABYTES = 1024 * 1024 * 1024; @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { builder.setDefaultRequestOptions(new RequestOptions().format(DecodeFormat.PREFER_ARGB_8888)); - builder.setDiskCache(new InternalCacheDiskCacheFactory(context, - UserPreferences.getImageCacheSize())); + @SuppressLint("UsableSpace") + long spaceAvailable = context.getCacheDir().getUsableSpace(); + long imageCacheSize = (spaceAvailable > 2 * GIGABYTES) ? (250 * MEGABYTES) : (50 * MEGABYTES); + Log.d(TAG, "Free space on cache dir: " + spaceAvailable + ", using image cache size: " + imageCacheSize); + builder.setDiskCache(new InternalCacheDiskCacheFactory(context, imageCacheSize)); } @Override 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 046e5a5a7..76dfab169 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 @@ -8,7 +8,6 @@ import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; -import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.core.app.NotificationCompat; @@ -40,7 +39,6 @@ import de.danoeh.antennapod.core.storage.ExceptFavoriteCleanupAlgorithm; 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; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.core.util.download.AutoUpdateManager; @@ -116,7 +114,6 @@ public class UserPreferences { // Other private static final String PREF_DATA_FOLDER = "prefDataFolder"; - public static final String PREF_IMAGE_CACHE_SIZE = "prefImageCacheSize"; public static final String PREF_DELETE_REMOVES_FROM_QUEUE = "prefDeleteRemovesFromQueue"; public static final String PREF_USAGE_COUNTING_DATE = "prefUsageCounting"; @@ -129,8 +126,6 @@ public class UserPreferences { private static final String PREF_FAST_FORWARD_SECS = "prefFastForwardSecs"; private static final String PREF_REWIND_SECS = "prefRewindSecs"; private static final String PREF_QUEUE_LOCKED = "prefQueueLocked"; - private static final String IMAGE_CACHE_DEFAULT_VALUE = "100"; - private static final int IMAGE_CACHE_SIZE_MINIMUM = 20; private static final String PREF_LEFT_VOLUME = "prefLeftVolume"; private static final String PREF_RIGHT_VOLUME = "prefRightVolume"; @@ -471,24 +466,6 @@ public class UserPreferences { return readPlaybackSpeedArray(prefs.getString(PREF_PLAYBACK_SPEED_ARRAY, null)); } - public static float getLeftVolume() { - int volume = prefs.getInt(PREF_LEFT_VOLUME, 100); - return Converter.getVolumeFromPercentage(volume); - } - - public static float getRightVolume() { - int volume = prefs.getInt(PREF_RIGHT_VOLUME, 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() { return prefs.getBoolean(PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS, false); } @@ -616,18 +593,6 @@ public class UserPreferences { return Build.VERSION.SDK_INT < 29 && prefs.getBoolean(PREF_ENABLE_AUTODL_WIFI_FILTER, false); } - public static int getImageCacheSize() { - String cacheSizeString = prefs.getString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE); - 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.parseInt(IMAGE_CACHE_DEFAULT_VALUE); - } - return cacheSizeInt * 1024 * 1024; - } - public static int getFastForwardSecs() { return prefs.getInt(PREF_FAST_FORWARD_SECS, 30); } @@ -727,14 +692,6 @@ public class UserPreferences { .apply(); } - public static void setVolume(@IntRange(from = 0, to = 100) int leftVolume, - @IntRange(from = 0, to = 100) int rightVolume) { - prefs.edit() - .putInt(PREF_LEFT_VOLUME, leftVolume) - .putInt(PREF_RIGHT_VOLUME, rightVolume) - .apply(); - } - public static void setAutodownloadSelectedNetworks(String[] value) { prefs.edit() .putString(PREF_AUTODL_SELECTED_NETWORKS, TextUtils.join(",", value)) 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 dc29f53d4..3016b96d5 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 @@ -322,10 +322,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { acquireWifiLockIfNecessary(); setPlaybackParams(PlaybackSpeedUtils.getCurrentPlaybackSpeed(media), UserPreferences.isSkipSilence()); - - float leftVolume = UserPreferences.getLeftVolume(); - float rightVolume = UserPreferences.getRightVolume(); - setVolume(leftVolume, rightVolume); + setVolume(1.0f, 1.0f); if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) { int newPosition = RewindAfterPauseUtils.calculatePositionWithRewind( @@ -891,16 +888,13 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (pausedBecauseOfTransientAudiofocusLoss) { // we paused => play now resume(); } else { // we ducked => raise audio level back - setVolumeSync(UserPreferences.getLeftVolume(), - UserPreferences.getRightVolume()); + setVolumeSync(1.0f, 1.0f); } } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { if (playerStatus == PlayerStatus.PLAYING) { if (!UserPreferences.shouldPauseForFocusLoss()) { Log.d(TAG, "Lost audio focus temporarily. Ducking..."); - final float DUCK_FACTOR = 0.25f; - setVolumeSync(DUCK_FACTOR * UserPreferences.getLeftVolume(), - DUCK_FACTOR * UserPreferences.getRightVolume()); + setVolumeSync(0.25f, 0.25f); 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/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index ef4e28448..2da06e226 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 @@ -13,7 +13,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; -import android.graphics.Bitmap; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; @@ -41,10 +40,6 @@ import android.view.SurfaceHolder; import android.webkit.URLUtil; import android.widget.Toast; -import com.bumptech.glide.Glide; -import com.bumptech.glide.request.RequestOptions; -import com.bumptech.glide.request.target.Target; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -63,7 +58,6 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.playback.MediaType; -import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -72,7 +66,6 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.FeedSearcher; -import de.danoeh.antennapod.core.feed.util.ImageResourceUtils; import de.danoeh.antennapod.core.sync.SyncService; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; @@ -779,25 +772,19 @@ public class PlaybackService extends MediaBrowserServiceCompat { final float[] multiplicators = {0.1f, 0.2f, 0.3f, 0.3f, 0.3f, 0.4f, 0.4f, 0.4f, 0.6f, 0.8f}; float multiplicator = multiplicators[Math.max(0, (int) timeLeft / 1000)]; Log.d(TAG, "onSleepTimerAlmostExpired: " + multiplicator); - float leftVolume = multiplicator * UserPreferences.getLeftVolume(); - float rightVolume = multiplicator * UserPreferences.getRightVolume(); - mediaPlayer.setVolume(leftVolume, rightVolume); + mediaPlayer.setVolume(multiplicator, multiplicator); } @Override public void onSleepTimerExpired() { mediaPlayer.pause(true, true); - float leftVolume = UserPreferences.getLeftVolume(); - float rightVolume = UserPreferences.getRightVolume(); - mediaPlayer.setVolume(leftVolume, rightVolume); + mediaPlayer.setVolume(1.0f, 1.0f); sendNotificationBroadcast(NOTIFICATION_TYPE_SLEEPTIMER_UPDATE, 0); } @Override public void onSleepTimerReset() { - float leftVolume = UserPreferences.getLeftVolume(); - float rightVolume = UserPreferences.getRightVolume(); - mediaPlayer.setVolume(leftVolume, rightVolume); + mediaPlayer.setVolume(1.0f, 1.0f); } @Override @@ -1286,81 +1273,43 @@ public class PlaybackService extends MediaBrowserServiceCompat { (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)); } - /** - * Used by updateMediaSessionMetadata to load notification data in another thread. - */ - private Thread mediaSessionSetupThread; - private void updateMediaSessionMetadata(final Playable p) { if (p == null || mediaSession == null) { return; } - if (mediaSessionSetupThread != null) { - mediaSessionSetupThread.interrupt(); - } - - Runnable mediaSessionSetupTask = () -> { - MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); - builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, p.getFeedTitle()); - builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, p.getEpisodeTitle()); - builder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, p.getFeedTitle()); - builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, p.getDuration()); - builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, p.getEpisodeTitle()); - builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, p.getFeedTitle()); - - String imageLocation = p.getImageLocation(); - - if (!TextUtils.isEmpty(imageLocation)) { - if (UserPreferences.setLockscreenBackground()) { - Bitmap art; - builder.putString(MediaMetadataCompat.METADATA_KEY_ART_URI, imageLocation); - try { - art = Glide.with(this) - .asBitmap() - .load(imageLocation) - .apply(RequestOptions.diskCacheStrategyOf(ApGlideSettings.AP_DISK_CACHE_STRATEGY)) - .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) - .get(); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, art); - } catch (Throwable tr1) { - try { - art = Glide.with(this) - .asBitmap() - .load(ImageResourceUtils.getFallbackImageLocation(p)) - .apply(RequestOptions.diskCacheStrategyOf(ApGlideSettings.AP_DISK_CACHE_STRATEGY)) - .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) - .get(); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, art); - } catch (Throwable tr2) { - Log.e(TAG, Log.getStackTraceString(tr2)); - } - } - } else if (isCasting) { - // In the absence of metadata art, the controller dialog takes care of creating it. - builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, imageLocation); - } - } - if (!Thread.currentThread().isInterrupted() && stateManager.hasReceivedValidStartCommand()) { - mediaSession.setSessionActivity(PendingIntent.getActivity(this, R.id.pending_intent_player_activity, - PlaybackService.getPlayerActivityIntent(this), PendingIntent.FLAG_UPDATE_CURRENT)); - try { - mediaSession.setMetadata(builder.build()); - } catch (OutOfMemoryError e) { - Log.e(TAG, "Setting media session metadata", e); - builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, null); - mediaSession.setMetadata(builder.build()); - } - } - }; - mediaSessionSetupThread = new Thread(mediaSessionSetupTask); - mediaSessionSetupThread.start(); + MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); + builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, p.getFeedTitle()); + builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, p.getEpisodeTitle()); + builder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, p.getFeedTitle()); + builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, p.getDuration()); + builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, p.getEpisodeTitle()); + builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, p.getFeedTitle()); + + if (UserPreferences.setLockscreenBackground() && notificationBuilder.isIconCached()) { + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, notificationBuilder.getCachedIcon()); + } else if (isCasting && !TextUtils.isEmpty(p.getImageLocation())) { + // In the absence of metadata art, the controller dialog takes care of creating it. + builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI, p.getImageLocation()); + } + + if (stateManager.hasReceivedValidStartCommand()) { + mediaSession.setSessionActivity(PendingIntent.getActivity(this, R.id.pending_intent_player_activity, + PlaybackService.getPlayerActivityIntent(this), PendingIntent.FLAG_UPDATE_CURRENT)); + try { + mediaSession.setMetadata(builder.build()); + } catch (OutOfMemoryError e) { + Log.e(TAG, "Setting media session metadata", e); + builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, null); + mediaSession.setMetadata(builder.build()); + } + } } /** * Used by setupNotification to load notification data in another thread. */ - private Thread notificationSetupThread; + private Thread playableIconLoaderThread; /** * Prepares notification and starts the service in the foreground. @@ -1371,8 +1320,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { private synchronized void setupNotification(final Playable playable) { Log.d(TAG, "setupNotification"); - if (notificationSetupThread != null) { - notificationSetupThread.interrupt(); + if (playableIconLoaderThread != null) { + playableIconLoaderThread.interrupt(); } if (playable == null || mediaPlayer == null) { Log.d(TAG, "setupNotification: playable=" + playable); @@ -1395,14 +1344,15 @@ public class PlaybackService extends MediaBrowserServiceCompat { startForegroundIfPlaying(playerStatus); if (!notificationBuilder.isIconCached()) { - notificationSetupThread = new Thread(() -> { + playableIconLoaderThread = new Thread(() -> { Log.d(TAG, "Loading notification icon"); notificationBuilder.loadIcon(); if (!Thread.currentThread().isInterrupted()) { notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); + updateMediaSessionMetadata(playable); } }); - notificationSetupThread.start(); + playableIconLoaderThread.start(); } } @@ -1705,10 +1655,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { mediaPlayer.setPlaybackParams(getCurrentPlaybackSpeed(), skipSilence); } - public void setVolume(float leftVolume, float rightVolume) { - mediaPlayer.setVolume(leftVolume, rightVolume); - } - public float getCurrentPlaybackSpeed() { if(mediaPlayer == null) { return 1.0f; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java index 75ebf7e10..e7dea192a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java @@ -89,14 +89,22 @@ public class PlaybackServiceNotificationBuilder { .apply(new RequestOptions().centerCrop()) .submit(iconSize, iconSize) .get(); + } catch (InterruptedException ignore) { + Log.e(TAG, "Media icon loader was interrupted"); } catch (Throwable tr) { Log.e(TAG, "Error loading the media icon for the notification", tr); } + } catch (InterruptedException ignore) { + Log.e(TAG, "Media icon loader was interrupted"); } catch (Throwable tr) { Log.e(TAG, "Error loading the media icon for the notification", tr); } } + public Bitmap getCachedIcon() { + return icon; + } + private Bitmap getDefaultIcon() { if (defaultIcon == null) { defaultIcon = getBitmap(context, R.mipmap.ic_launcher); 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 8f9b8ce2f..4014937bd 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 @@ -12,9 +12,6 @@ public final class Converter { private Converter() { } - /** Logging tag. */ - private static final String TAG = "Converter"; - private static final int HOURS_MIL = 3600000; private static final int MINUTES_MIL = 60000; private static final int SECONDS_MIL = 1000; @@ -108,17 +105,4 @@ public final class Converter { 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/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 6fe2502ab..cd69147a6 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 @@ -496,12 +496,6 @@ public abstract class PlaybackController { } } - public void setVolume(float leftVolume, float rightVolume) { - if (playbackService != null) { - playbackService.setVolume(leftVolume, rightVolume); - } - } - public float getCurrentPlaybackSpeedMultiplier() { if (playbackService != null) { return playbackService.getCurrentPlaybackSpeed(); diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 290c8635f..97b677362 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -270,22 +270,6 @@ <item>DURATION_LONG_SHORT</item> </string-array> - <string-array name="image_cache_size_options"> - <item>20 MiB</item> - <item>50 MiB</item> - <item>100 MiB</item> - <item>250 MiB</item> - <item>500 MiB</item> - </string-array> - - <string-array name="image_cache_size_values"> - <item>20</item> - <item>50</item> - <item>100</item> - <item>250</item> - <item>500</item> - </string-array> - <string-array name="compact_notification_buttons_options"> <item>@string/rewind_label</item> <item>@string/fast_forward_label</item> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 86f79318a..670c74993 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -110,7 +110,7 @@ <string name="auto_download_label">Include in auto downloads</string> <string name="auto_delete_label">Auto Delete Episode</string> <string name="feed_volume_reduction">Volume Reduction</string> - <string name="feed_volume_reduction_summary">Turn down volume for episodes of this feed: %1$s</string> + <string name="feed_volume_reduction_summary">Turn down volume for episodes of this podcast: %1$s</string> <string name="feed_volume_reduction_off">Off</string> <string name="feed_volume_reduction_light">Light</string> <string name="feed_volume_reduction_heavy">Heavy</string> @@ -483,8 +483,6 @@ <string name="enqueue_location_front">Front</string> <string name="enqueue_location_after_current">After current episode</string> <string name="pref_smart_mark_as_played_disabled">Disabled</string> - <string name="pref_image_cache_size_title">Image Cache Size</string> - <string name="pref_image_cache_size_sum">Size of the disk cache for images.</string> <string name="documentation_support">Documentation & Support</string> <string name="visit_user_forum">User forum</string> <string name="bug_report_title">Report bug</string> @@ -776,9 +774,6 @@ <!-- Audio controls --> <string name="audio_controls">Audio controls</string> <string name="playback_speed">Playback Speed</string> - <string name="volume">Volume</string> - <string name="left_short">L</string> - <string name="right_short">R</string> <string name="audio_effects">Audio Effects</string> <string name="stereo_to_mono">Downmix: Stereo to mono</string> <string name="sonic_only">Sonic only</string> |