diff options
author | ByteHamster <info@bytehamster.com> | 2020-10-28 10:56:22 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2020-10-28 10:56:22 +0100 |
commit | 8ad4682aa4cfc58065f02e12b5072b6ee966fafd (patch) | |
tree | 28b99744e35f6053326013c01a1b7e87d15db212 | |
parent | 109e5716ed06f924b1b3c4324f8f3bf8fedc3de8 (diff) | |
parent | 81e2be8f2b7bd7e6bc7cb8c427443ec6cb596859 (diff) | |
download | AntennaPod-8ad4682aa4cfc58065f02e12b5072b6ee966fafd.zip |
Merge branch 'master' into develop
15 files changed, 458 insertions, 244 deletions
diff --git a/app/build.gradle b/app/build.gradle index bfcbf4147..2880f980f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,8 +22,8 @@ android { // "1.2.3-SNAPSHOT" -> 1020300 // "1.2.3-RC4" -> 1020304 // "1.2.3" -> 1020395 - versionCode 2000295 - versionName "2.0.2" + versionCode 2000395 + versionName "2.0.3" multiDexEnabled false vectorDrawables.useSupportLibrary true diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 6f237e1aa..a398a5e94 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -184,6 +184,9 @@ public class MainActivity extends CastEnabledActivity { public void onSlide(@NonNull View view, float slideOffset) { AudioPlayerFragment audioPlayer = (AudioPlayerFragment) getSupportFragmentManager() .findFragmentByTag(AudioPlayerFragment.TAG); + if (audioPlayer == null) { + return; + } float condensedSlideOffset = Math.max(0.0f, Math.min(0.2f, slideOffset - 0.2f)) / 0.2f; audioPlayer.getExternalPlayerHolder().setAlpha(1 - condensedSlideOffset); audioPlayer.getExternalPlayerHolder().setVisibility( diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java index 8efc89c9a..4762622d1 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/EpisodeItemListAdapter.java @@ -92,11 +92,11 @@ public class EpisodeItemListAdapter extends RecyclerView.Adapter<EpisodeItemView // Set all listeners to null. This is required to prevent leaking fragments that have set a listener. // Activity -> recycledViewPool -> EpisodeItemViewHolder -> Listener -> Fragment (can not be garbage collected) holder.itemView.setOnClickListener(null); + holder.itemView.setOnCreateContextMenuListener(null); + holder.itemView.setOnLongClickListener(null); holder.secondaryActionButton.setOnClickListener(null); holder.dragHandle.setOnTouchListener(null); holder.coverHolder.setOnTouchListener(null); - holder.container.setOnCreateContextMenuListener(null); - holder.container.setOnLongClickListener(null); } /** diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java index 3129aa43c..5a65f956c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java @@ -133,7 +133,12 @@ public class AudioPlayerFragment extends Fragment implements pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { - pager.post(() -> ((MainActivity) getActivity()).getBottomSheet().updateScrollingChild()); + pager.post(() -> { + if (getActivity() != null) { + // By the time this is posted, the activity might be closed again. + ((MainActivity) getActivity()).getBottomSheet().updateScrollingChild(); + } + }); } }); pageIndicator = root.findViewById(R.id.page_indicator); diff --git a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java index 902e5094b..35744227f 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/view/viewholder/EpisodeItemViewHolder.java @@ -39,7 +39,7 @@ import de.danoeh.antennapod.view.CircularProgressBar; public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { private static final String TAG = "EpisodeItemViewHolder"; - public final View container; + private final View container; public final ImageView dragHandle; private final TextView placeholder; private final ImageView cover; @@ -102,7 +102,7 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { isNew.setVisibility(item.isNew() ? View.VISIBLE : View.GONE); isFavorite.setVisibility(item.isTagged(FeedItem.TAG_FAVORITE) ? View.VISIBLE : View.GONE); isInQueue.setVisibility(item.isTagged(FeedItem.TAG_QUEUE) ? View.VISIBLE : View.GONE); - itemView.setAlpha(item.isPlayed() ? 0.5f : 1.0f); + container.setAlpha(item.isPlayed() ? 0.5f : 1.0f); ItemActionButton actionButton = ItemActionButton.forItem(item, true, true); actionButton.configure(secondaryActionButton, secondaryActionIcon, activity); @@ -116,6 +116,7 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { progressBar.setVisibility(View.GONE); duration.setVisibility(View.GONE); position.setVisibility(View.GONE); + itemView.setBackgroundResource(ThemeUtils.getDrawableFromAttr(activity, R.attr.selectableItemBackground)); } if (coverHolder.getVisibility() == View.VISIBLE) { @@ -136,9 +137,9 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { Converter.getDurationStringLocalized(activity, media.getDuration()))); if (media.isCurrentlyPlaying()) { - container.setBackgroundColor(ThemeUtils.getColorFromAttr(activity, R.attr.currently_playing_background)); + itemView.setBackgroundColor(ThemeUtils.getColorFromAttr(activity, R.attr.currently_playing_background)); } else { - container.setBackgroundResource(ThemeUtils.getDrawableFromAttr(activity, R.attr.selectableItemBackground)); + itemView.setBackgroundResource(ThemeUtils.getDrawableFromAttr(activity, R.attr.selectableItemBackground)); } if (DownloadRequester.getInstance().isDownloadingFile(media)) { diff --git a/app/src/main/play/release-notes/en-US/default.txt b/app/src/main/play/release-notes/en-US/default.txt index b44fd22bd..a27f2d0c0 100644 --- a/app/src/main/play/release-notes/en-US/default.txt +++ b/app/src/main/play/release-notes/en-US/default.txt @@ -1,4 +1,4 @@ -We are proud to release version 2.0.0 with a new logo and refreshed user interface. +We are proud to release version 2.0 with a new logo and refreshed user interface. Thank you to 6420 users who participated in the vote for the new logo! - Support for chapter images (only new episodes, by @ByteHamster) diff --git a/app/src/main/res/layout/feeditemlist_item.xml b/app/src/main/res/layout/feeditemlist_item.xml index 7083365e7..a8ae5743e 100644 --- a/app/src/main/res/layout/feeditemlist_item.xml +++ b/app/src/main/res/layout/feeditemlist_item.xml @@ -1,225 +1,236 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout +<FrameLayout xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:gravity="center_vertical" - android:baselineAligned="false" - android:paddingStart="12dp" - android:paddingLeft="12dp" - android:paddingEnd="0dp" - android:paddingRight="0dp"> + android:layout_height="wrap_content"> - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:id="@+id/left_padding" - android:minWidth="4dp"> - <ImageView - android:id="@+id/drag_handle" - android:layout_width="16dp" - android:layout_height="match_parent" - android:importantForAccessibility="no" - android:scaleType="fitCenter" - android:src="?attr/dragview_background" - android:paddingStart="0dp" - android:paddingLeft="0dp" - android:paddingEnd="4dp" - android:paddingRight="4dp" - tools:src="@drawable/ic_drag_darktheme" - tools:background="@android:color/holo_green_dark"/> - - </LinearLayout> - - <androidx.cardview.widget.CardView - android:layout_width="@dimen/thumbnail_length_queue_item" - android:layout_height="@dimen/thumbnail_length_queue_item" - android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding" - android:layout_marginTop="@dimen/listitem_threeline_verticalpadding" - android:layout_marginRight="@dimen/listitem_threeline_textleftpadding" - android:layout_marginEnd="@dimen/listitem_threeline_textleftpadding" - android:id="@+id/coverHolder" - app:cardBackgroundColor="@color/non_square_icon_background" - app:cardCornerRadius="4dp" - app:cardPreventCornerOverlap="false" - app:cardElevation="0dp"> - - <RelativeLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <TextView - android:id="@+id/txtvPlaceholder" - android:layout_width="@dimen/thumbnail_length_queue_item" - android:layout_height="@dimen/thumbnail_length_queue_item" - android:layout_centerVertical="true" - android:gravity="center" - android:background="@color/light_gray" - android:maxLines="3" - android:padding="2dp" - android:ellipsize="end"/> - <ImageView - android:id="@+id/imgvCover" - android:layout_width="@dimen/thumbnail_length_queue_item" - android:layout_height="@dimen/thumbnail_length_queue_item" - android:layout_centerVertical="true" - android:importantForAccessibility="no" - tools:src="@tools:sample/avatars"/> - - </RelativeLayout> - </androidx.cardview.widget.CardView> + <!-- + This parent FrameLayout is necessary because RecyclerView's ItemAnimator changes alpha values, + which conflicts with our played state indicator. + --> <LinearLayout - android:layout_width="0dp" + android:id="@+id/container" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding" - android:layout_marginRight="@dimen/listitem_threeline_textrightpadding" - android:layout_marginEnd="@dimen/listitem_threeline_textrightpadding" - android:layout_marginTop="@dimen/listitem_threeline_verticalpadding" - android:layout_weight="1" - tools:background="@android:color/holo_red_dark" - android:orientation="vertical"> + android:orientation="horizontal" + android:gravity="center_vertical" + android:baselineAligned="false" + android:paddingStart="12dp" + android:paddingLeft="12dp" + android:paddingEnd="0dp" + android:paddingRight="0dp" + tools:ignore="UselessParent"> <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:id="@+id/status" - android:orientation="horizontal" - android:gravity="center_vertical"> - - <TextView - android:text="@string/new_label" - style="@style/AntennaPod.TextView.UnreadIndicator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:id="@+id/statusUnread" - android:layout_marginRight="4dp" - android:layout_marginEnd="4dp" - tools:text="@sample/episodes.json/data/status_label"/> - - <ImageView - android:layout_width="14sp" - android:layout_height="14sp" - app:srcCompat="?attr/type_video" - tools:srcCompat="@drawable/ic_videocam_black_24dp" - android:contentDescription="@string/media_type_video_label" - android:id="@+id/ivIsVideo"/> - - <ImageView - android:layout_width="14sp" - android:layout_height="14sp" - app:srcCompat="?attr/ic_unfav" - tools:srcCompat="@drawable/ic_star_black" - android:contentDescription="@string/is_favorite_label" - android:id="@+id/isFavorite"/> - + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:id="@+id/left_padding" + android:minWidth="4dp"> <ImageView - android:layout_width="14sp" - android:layout_height="14sp" - app:srcCompat="?attr/stat_playlist" - tools:srcCompat="@drawable/ic_playlist_black" - android:contentDescription="@string/in_queue_label" - android:id="@+id/ivInPlaylist"/> - - <TextView - android:id="@+id/separatorIcons" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="4dp" - android:layout_marginStart="4dp" - android:layout_marginRight="4dp" - android:layout_marginEnd="4dp" - android:text="·" - tools:background="@android:color/holo_blue_light"/> - - <TextView - android:id="@+id/txtvPubDate" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="4dp" - android:layout_marginEnd="4dp" - tools:text="@sample/episodes.json/data/published_at"/> - - <TextView - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="4dp" - android:layout_marginEnd="4dp" - android:text="·" - tools:background="@android:color/holo_blue_light"/> - - <TextView - android:id="@+id/size" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_marginRight="4dp" - android:layout_marginEnd="4dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - tools:text="10 MB"/> + android:id="@+id/drag_handle" + android:layout_width="16dp" + android:layout_height="match_parent" + android:importantForAccessibility="no" + android:scaleType="fitCenter" + android:src="?attr/dragview_background" + android:paddingStart="0dp" + android:paddingLeft="0dp" + android:paddingEnd="4dp" + android:paddingRight="4dp" + tools:src="@drawable/ic_drag_darktheme" + tools:background="@android:color/holo_green_dark"/> </LinearLayout> - <!-- - Warning: android:contentDescription is set to an empty string. - The title is read as contentDescription of left_padding to have it read first. - Keep this in mind when changing the order of this layout! - --> - <TextView - android:id="@+id/txtvTitle" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - tools:text="@sample/episodes.json/data/title" - android:importantForAccessibility="no" - android:ellipsize="end" - tools:background="@android:color/holo_blue_light"/> + <androidx.cardview.widget.CardView + android:layout_width="@dimen/thumbnail_length_queue_item" + android:layout_height="@dimen/thumbnail_length_queue_item" + android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding" + android:layout_marginTop="@dimen/listitem_threeline_verticalpadding" + android:layout_marginRight="@dimen/listitem_threeline_textleftpadding" + android:layout_marginEnd="@dimen/listitem_threeline_textleftpadding" + android:id="@+id/coverHolder" + app:cardBackgroundColor="@color/non_square_icon_background" + app:cardCornerRadius="4dp" + app:cardPreventCornerOverlap="false" + app:cardElevation="0dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/txtvPlaceholder" + android:layout_width="@dimen/thumbnail_length_queue_item" + android:layout_height="@dimen/thumbnail_length_queue_item" + android:layout_centerVertical="true" + android:gravity="center" + android:background="@color/light_gray" + android:maxLines="3" + android:padding="2dp" + android:ellipsize="end"/> + <ImageView + android:id="@+id/imgvCover" + android:layout_width="@dimen/thumbnail_length_queue_item" + android:layout_height="@dimen/thumbnail_length_queue_item" + android:layout_centerVertical="true" + android:importantForAccessibility="no" + tools:src="@tools:sample/avatars"/> + + </RelativeLayout> + </androidx.cardview.widget.CardView> <LinearLayout - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="wrap_content" - android:id="@+id/progress" - android:orientation="horizontal" - android:gravity="center_vertical"> - + android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding" + android:layout_marginRight="@dimen/listitem_threeline_textrightpadding" + android:layout_marginEnd="@dimen/listitem_threeline_textrightpadding" + android:layout_marginTop="@dimen/listitem_threeline_verticalpadding" + android:layout_weight="1" + tools:background="@android:color/holo_red_dark" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/status" + android:orientation="horizontal" + android:gravity="center_vertical"> + + <TextView + android:text="@string/new_label" + style="@style/AntennaPod.TextView.UnreadIndicator" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/statusUnread" + android:layout_marginRight="4dp" + android:layout_marginEnd="4dp" + tools:text="@sample/episodes.json/data/status_label"/> + + <ImageView + android:layout_width="14sp" + android:layout_height="14sp" + app:srcCompat="?attr/type_video" + tools:srcCompat="@drawable/ic_videocam_black_24dp" + android:contentDescription="@string/media_type_video_label" + android:id="@+id/ivIsVideo"/> + + <ImageView + android:layout_width="14sp" + android:layout_height="14sp" + app:srcCompat="?attr/ic_unfav" + tools:srcCompat="@drawable/ic_star_black" + android:contentDescription="@string/is_favorite_label" + android:id="@+id/isFavorite"/> + + <ImageView + android:layout_width="14sp" + android:layout_height="14sp" + app:srcCompat="?attr/stat_playlist" + tools:srcCompat="@drawable/ic_playlist_black" + android:contentDescription="@string/in_queue_label" + android:id="@+id/ivInPlaylist"/> + + <TextView + android:id="@+id/separatorIcons" + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="4dp" + android:layout_marginStart="4dp" + android:layout_marginRight="4dp" + android:layout_marginEnd="4dp" + android:text="·" + tools:background="@android:color/holo_blue_light"/> + + <TextView + android:id="@+id/txtvPubDate" + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="4dp" + android:layout_marginEnd="4dp" + tools:text="@sample/episodes.json/data/published_at"/> + + <TextView + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="4dp" + android:layout_marginEnd="4dp" + android:text="·" + tools:background="@android:color/holo_blue_light"/> + + <TextView + android:id="@+id/size" + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_marginRight="4dp" + android:layout_marginEnd="4dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + tools:text="10 MB"/> + + </LinearLayout> + + <!-- + Warning: android:contentDescription is set to an empty string. + The title is read as contentDescription of left_padding to have it read first. + Keep this in mind when changing the order of this layout! + --> <TextView - android:id="@+id/txtvPosition" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="wrap_content" + android:id="@+id/txtvTitle" + style="@style/AntennaPod.TextView.ListItemPrimaryTitle" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="0dp" - tools:text="00:42:23" - tools:background="@android:color/holo_blue_light"/> - - <ProgressBar - android:id="@+id/progressBar" - style="?attr/progressBarTheme" - android:layout_width="0dp" - android:layout_weight="1" - android:layout_height="4dp" - android:max="100" - android:layout_margin="4dp" + tools:text="@sample/episodes.json/data/title" + android:importantForAccessibility="no" + android:ellipsize="end" tools:background="@android:color/holo_blue_light"/> - <TextView - android:id="@+id/txtvDuration" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="wrap_content" + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="0dp" - tools:text="@sample/episodes.json/data/duration" - tools:background="@android:color/holo_blue_light"/> + android:id="@+id/progress" + android:orientation="horizontal" + android:gravity="center_vertical"> + + <TextView + android:id="@+id/txtvPosition" + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="0dp" + tools:text="00:42:23" + tools:background="@android:color/holo_blue_light"/> + + <ProgressBar + android:id="@+id/progressBar" + style="?attr/progressBarTheme" + android:layout_width="0dp" + android:layout_weight="1" + android:layout_height="4dp" + android:max="100" + android:layout_margin="4dp" + tools:background="@android:color/holo_blue_light"/> + + <TextView + android:id="@+id/txtvDuration" + style="@style/AntennaPod.TextView.ListItemSecondaryTitle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="0dp" + tools:text="@sample/episodes.json/data/duration" + tools:background="@android:color/holo_blue_light"/> + + </LinearLayout> </LinearLayout> - </LinearLayout> + <include layout="@layout/secondary_action"/> - <include layout="@layout/secondary_action"/> - -</LinearLayout> + </LinearLayout> +</FrameLayout> 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 25c301ccc..60075dda6 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 @@ -216,7 +216,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { private Disposable positionEventTimer; private PlaybackServiceNotificationBuilder notificationBuilder; - private long autoSkippedFeedMediaId = -1; + private String autoSkippedFeedMediaId = null; /** * Used for Lollipop notifications, Android Wear, and Android Auto. @@ -650,7 +650,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { } return false; case KeyEvent.KEYCODE_MEDIA_NEXT: - if (notificationButton || UserPreferences.shouldHardwareButtonSkip()) { + if (getStatus() != PlayerStatus.PLAYING && getStatus() != PlayerStatus.PAUSED) { + return false; + } else if (notificationButton || UserPreferences.shouldHardwareButtonSkip()) { // assume the skip command comes from a notification or the lockscreen // a >| skip button should actually skip mediaPlayer.skip(); @@ -661,10 +663,15 @@ public class PlaybackService extends MediaBrowserServiceCompat { } return true; case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: - mediaPlayer.seekDelta(UserPreferences.getFastForwardSecs() * 1000); - return true; + if (getStatus() == PlayerStatus.PLAYING || getStatus() == PlayerStatus.PAUSED) { + mediaPlayer.seekDelta(UserPreferences.getFastForwardSecs() * 1000); + return true; + } + return false; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - if (UserPreferences.shouldHardwarePreviousButtonRestart()) { + if (getStatus() != PlayerStatus.PLAYING && getStatus() != PlayerStatus.PAUSED) { + return false; + } else if (UserPreferences.shouldHardwarePreviousButtonRestart()) { // user wants to restart current episode mediaPlayer.seekTo(0); } else { @@ -673,7 +680,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { } return true; case KeyEvent.KEYCODE_MEDIA_REWIND: - mediaPlayer.seekDelta(-UserPreferences.getRewindSecs() * 1000); + if (getStatus() == PlayerStatus.PLAYING || getStatus() == PlayerStatus.PAUSED) { + mediaPlayer.seekDelta(-UserPreferences.getRewindSecs() * 1000); + } else { + return false; + } return true; case KeyEvent.KEYCODE_MEDIA_STOP: if (status == PlayerStatus.PLAYING) { @@ -1072,18 +1083,21 @@ public class PlaybackService extends MediaBrowserServiceCompat { Log.d(TAG, "smart mark as played"); } + boolean autoSkipped = false; + if (autoSkippedFeedMediaId != null && autoSkippedFeedMediaId.equals(item.getIdentifyingValue())) { + autoSkippedFeedMediaId = null; + autoSkipped = true; + } + if (ended || smartMarkAsPlayed) { media.onPlaybackCompleted(getApplicationContext()); } else { media.onPlaybackPause(getApplicationContext()); } - if (autoSkippedFeedMediaId >= 0 && autoSkippedFeedMediaId == media.getId()) { - ended = true; - } - if (item != null) { if (ended || smartMarkAsPlayed + || autoSkipped || (skipped && !UserPreferences.shouldSkipKeepEpisode())) { // only mark the item as played if we're not keeping it anyways DBWriter.markItemPlayed(item, FeedItem.PLAYED, ended); @@ -1135,7 +1149,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { FeedPreferences preferences = feedMedia.getItem().getFeed().getPreferences(); int skipEnd = preferences.getFeedSkipEnding(); if (skipEnd > 0 - && skipEnd < getDuration() + && skipEnd * 1000 < getDuration() && (remainingTime - (skipEnd * 1000) > 0) && ((remainingTime - skipEnd * 1000) < (getCurrentPlaybackSpeed() * 1000))) { Log.d(TAG, "skipEndingIfNecessary: Skipping the remaining " + remainingTime + " " + skipEnd * 1000 + " speed " + getCurrentPlaybackSpeed()); @@ -1144,7 +1158,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { Toast toast = Toast.makeText(context, skipMesg, Toast.LENGTH_LONG); toast.show(); - this.autoSkippedFeedMediaId = feedMedia.getItem().getId(); + this.autoSkippedFeedMediaId = feedMedia.getItem().getIdentifyingValue(); mediaPlayer.skip(); } } 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 d47d26af9..425a07f4a 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 @@ -512,6 +512,7 @@ public class PlaybackController { new PlaybackServiceStarter(activity, media) .startWhenPrepared(true) .streamIfLastWasStream() + .callEvenIfRunning(true) .start(); Log.w(TAG, "Play/Pause button was pressed and PlaybackService state was unknown"); break; diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml index 30a71465a..998d06213 100644 --- a/core/src/main/res/values-ca/strings.xml +++ b/core/src/main/res/values-ca/strings.xml @@ -420,18 +420,30 @@ <string name="pref_gpodnet_setlogin_information_sum">Canvia les dades d\'inici de sessió del vostre compte de gpodder.net</string> <string name="pref_gpodnet_sync_changes_title">Sincronitza ara</string> <string name="pref_gpodnet_sync_changes_sum">Sincronitza amb gpodder.net les subscripcions i els estats dels episodis.</string> + <string name="pref_gpodnet_full_sync_title">Força sincronització completa</string> <string name="pref_gpodnet_full_sync_sum">Sincronitza amb gpodder.net totes les subscripcions i els estats dels episodis.</string> <string name="pref_gpodnet_login_status"><![CDATA[Connectat com a <i>%1$s</i> amb el dispositiu <i>%2$s</i>]]></string> <string name="pref_gpodnet_notifications_title">Notifica els errors de sincronització</string> <string name="pref_gpodnet_notifications_sum">Aquest paràmetre no s\'aplica als errors d\'autenticació. </string> <string name="pref_playback_speed_title">Velocitats de reproducció</string> <string name="pref_playback_speed_sum">Personalitzeu les velocitats disponibles per a una velocitat de reproducció d\'àudio variable</string> + <string name="pref_feed_playback_speed_sum">La velocitat a usar quan comence la reproducció per a episodis en aquest podcast</string> + <string name="pref_feed_skip">Auto Ometre</string> + <string name="pref_feed_skip_sum">Omet introduccions i crèdits finals</string> + <string name="pref_feed_skip_ending">Omet final (en segons):</string> + <string name="pref_feed_skip_intro">Omet introducció (en segons):</string> + <string name="pref_feed_skip_ending_toast">Omesos els últims %dsegons</string> + <string name="pref_feed_skip_intro_toast">Omesos els primers %d segons</string> + <string name="pref_playback_time_respects_speed_title">Ajusta la informació dels medis a la velocitat de reproducció</string> + <string name="pref_playback_time_respects_speed_sum">La posició i la duració son adaptades a la velocitat de reproducció</string> <string name="pref_fast_forward">Temps de salt de l\'Avanç ràpid</string> <string name="pref_fast_forward_sum">Personalitzar el nombre de segons del salt endavant quan es prem el botó d\'Avanç ràpid.</string> <string name="pref_rewind">Temps de salt del Rebobinat</string> <string name="pref_rewind_sum">Personalitza el nombre de segons del salt endarrere quan es prem el botó de Rebobinat</string> <string name="pref_gpodnet_sethostname_title">Definex nom del servidor</string> <string name="pref_gpodnet_sethostname_use_default_host">Utilitza el servidor per defecte</string> + <string name="pref_expandNotify_title">Alta prioritat de notificacions</string> + <string name="pref_expandNotify_sum">Açò normalment expandeix la notificació per a mostrar botons de reproducció</string> <string name="pref_persistNotify_title">Botons de reproducció persistents</string> <string name="pref_persistNotify_sum">Manté els controls a l\'àrea de notificacions i pantalla de bloqueig quan la reproducció estigui aturada</string> <string name="pref_compact_notification_buttons_title">Estableix els botons del bloqueig de pantalla</string> @@ -442,15 +454,29 @@ <string name="pref_lockscreen_background_sum">Estableix el fons del bloqueig de pantalla a la imatge de l\'episodi actual. Com a efecte secundari, això també mostrarà la imatge en aplicacions de tercers.</string> <string name="pref_showDownloadReport_title">Mostra informació de baixades</string> <string name="pref_showDownloadReport_sum">Si les descàrregues fallen, genera un informe que mostra els detalls de la fallada.</string> + <string name="pref_showAutoDownloadReport_title">Mostra Informe de baixades automàtiques</string> + <string name="pref_showAutoDownloadReport_sum">Mostra una notificació per a episodis descarregats automàticament</string> <string name="pref_expand_notify_unsupport_toast">Les versions d\'Android anteriors a la 4.1 no suporten les notificacions ampliades.</string> + <string name="pref_enqueue_location_title">Posició d\'entrada en cola</string> + <string name="pref_enqueue_location_sum">Afegit episodis a: %1$s</string> + <string name="enqueue_location_back">Final</string> + <string name="enqueue_location_front">Principi</string> + <string name="enqueue_location_after_current">Després de l\'episodi actual</string> <string name="pref_smart_mark_as_played_disabled">Desactivat</string> <string name="pref_image_cache_size_title">Mida de la memòria cau de les imatges</string> <string name="pref_image_cache_size_sum">Mida de la memòria cau en el disc de les imatges.</string> + <string name="visit_user_forum">Fòrum d\'usuaris</string> + <string name="bug_report_title">Informa d\'un bug</string> + <string name="open_bug_tracker">Obri rastrejador de bugs</string> + <string name="export_logs">Exporta els logs</string> + <string name="copy_to_clipboard">Còpia al porta-retalls </string> + <string name="copied_to_clipboard">Copiat al porta-retalls</string> <string name="experimental_pref">Experimental</string> <string name="pref_media_player_message">Seleccioneu el reproductor multimèdia per a reproduir fitxers</string> <string name="pref_current_value">Valor actual: %1$s</string> <string name="pref_proxy_title">Servidor intermediari</string> <string name="pref_proxy_sum">Estableix un servidor intermediari</string> + <string name="pref_faq">Preguntes Freqüents</string> <string name="pref_no_browser_found">No s\'ha trobat cap navegador web.</string> <string name="pref_cast_title">Suport per a Chromecast</string> <string name="pref_cast_message_play_flavor">Habilita el suport per la reproducció remota en dispositius de difusió (com ara Chromecast, Audio Speakers o Android TV). </string> @@ -458,18 +484,59 @@ <string name="pref_enqueue_downloaded_title">Afegeix les baixades a la cua</string> <string name="pref_enqueue_downloaded_summary">Afegeix els episodis descarregats a la cua</string> <string name="media_player_builtin">Reproductor Android estàndard</string> + <string name="media_player_switch_to_exoplayer">Canvia a ExoPlayer</string> + <string name="media_player_switched_to_exoplayer">Canviat a ExoPlayer</string> + <string name="pref_skip_silence_title">Omet Silenci en Audio</string> <string name="pref_videoBehavior_title">En sortir d\'un vídeo</string> <string name="pref_videoBehavior_sum">Comportament a l\'abandonar la reproducció d\'un vídeo</string> <string name="stop_playback">Atura reproducció</string> <string name="continue_playback">Continuar reproducció d\'audio</string> + <string name="behavior">Comportament</string> + <string name="pref_back_button_behavior_title">Comportament del botó \"endarrere\"</string> + <string name="pref_back_button_behavior_sum">Canvia el comportament del botó \"endarrere\"</string> + <string name="back_button_default">Per defecte</string> + <string name="back_button_open_drawer">Obri el calaix de navegació</string> + <string name="back_button_double_tap">Doble toc per a eixir</string> + <string name="back_button_show_prompt">Confema per a eixir</string> + <string name="close_prompt">Estàs segur que vols tancar AntennaPod?</string> + <string name="double_tap_toast">Toca el botó \"endarrere\" un altra vegada per a eixir</string> + <string name="back_button_go_to_page">Ves a la pàgina...</string> + <string name="back_button_go_to_page_title">Selecciona pàgina</string> + <string name="pref_delete_removes_from_queue_title">\"Esborrar\" remou de la cua</string> + <string name="pref_delete_removes_from_queue_sum">Remou automàticament un episodi de la cua quan siga esborrat</string> <!--About screen--> <string name="about_pref">Quant a</string> + <string name="antennapod_version">Versió d\'AntennaPod</string> + <string name="contributors">Contributors</string> + <string name="contributors_summary">Tothom pot ajudar a fer AntennaPod millor - amb codi, traduccions o ajudant als usuaris al nostre fòrum</string> + <string name="developers">Desenvolupadors</string> + <string name="translators">Traductors</string> + <string name="special_thanks">Agraïments especials</string> + <string name="privacy_policy">Política de privacitat</string> + <string name="licenses">Llicències</string> + <string name="licenses_summary">AntennaPod usa altre programati genial</string> <!--Search--> <string name="search_status_no_results">No s\'ha trobat cap resultat</string> <string name="search_label">Cerca</string> <string name="no_results_for_query">No s\'han trobat resultats per \"%1$s\"</string> <!--Synchronization--> + <string name="sync_status_started">Sincronització començada</string> + <string name="sync_status_episodes_upload">Pujant canvis d\'episodi</string> + <string name="sync_status_episodes_download">Descarregant canvis d\'episodi...</string> + <string name="sync_status_upload_played">Pujant estat de reproducció...</string> + <string name="sync_status_subscriptions">Sincronitzant subscripcions...</string> + <string name="sync_status_success">Sincronització exitosa</string> + <string name="sync_status_error">Sincronització fallida</string> <!--import and export--> + <string name="import_export_summary">Mou subscripcions i cola a un altre dispositiu</string> + <string name="database">Base de dades</string> + <string name="opml">OPML</string> + <string name="html">HTML</string> + <string name="html_export_summary">Mostra les teues subscripcions a un amic</string> + <string name="opml_export_summary">Transfereix les teues subscripcions a un altra aplicació de podcast</string> + <string name="opml_import_summary">Importa les teues subscripcions des d\'un altra aplicació de podcast</string> + <string name="database_export_summary">Transfereix subscripcions i cola a AntennaPod en un altre dispositiu</string> + <string name="database_import_summary">Importa base de dades d\'AntennaPod des d\'un altre dispositiu</string> <string name="opml_import_label">Importació d\'OPML</string> <string name="opml_reader_error">S\'ha produït un error en llegir el document OPML: </string> <string name="opml_import_error_no_file">Cap fitxer seleccionat!</string> @@ -477,17 +544,26 @@ <string name="deselect_all_label">Deselecciona-ho tot</string> <string name="opml_export_label">Exportació OPML</string> <string name="html_export_label">Exporta HTML</string> + <string name="database_export_label">Exporta base de dades</string> + <string name="database_import_label">Importa base de dades</string> + <string name="database_import_warning">Importar una base de dades reemplaçarà totes les teues subscripcions i històric de reproducció. Deuries exportar la teua base de dades com a còpia de seguretat. Vols reemplaçar?</string> + <string name="please_wait">Per favor, espera...</string> <string name="export_error_label">Error d\'exportació</string> <string name="export_success_title">Exportació correcta</string> <string name="export_success_sum">S\'ha exportat el fitxer a:\n\n%1$s</string> <string name="opml_import_ask_read_permission">Per llegir arxius OPML és necessari accés a la memòria externa</string> <string name="import_select_file">Tria un fitxer per a importar</string> <string name="import_ok">S\'ha importat amb èxit.\n\nPremeu D\'acord per a reiniciar l\'AntennaPod.</string> + <string name="import_no_downgrade">Aquesta base de dades va ser exportada amb una versió més nova d\'AntennaPod. La versió que tens ara mateixa no sap com processar-la.</string> + <string name="favorites_export_label">Exportar preferits</string> + <string name="favorites_export_summary">Exportar episodis favorits a un arxiu</string> <!--Sleep timer--> <string name="set_sleeptimer_label">Defineix un temporitzador</string> <string name="disable_sleeptimer_label">Desactiva el temporitzador</string> <string name="sleep_timer_label">Temporitzador</string> <string name="time_dialog_invalid_input">L\'entrada no és vàlida, ja que el temps ha de ser un nombre i no ho és</string> + <string name="shake_to_reset_label">Agita per a resetejar</string> + <string name="timer_vibration_label">Vibra un poc abans del final</string> <string name="time_seconds">segons</string> <string name="time_minutes">minuts</string> <string name="time_hours">hores</string> @@ -536,12 +612,14 @@ <string name="gpodnetsync_error_descr">S\'ha produït un error durant la sincronització:\u0020</string> <string name="gpodnetsync_pref_report_successful">Correcte</string> <string name="gpodnetsync_pref_report_failed">Ha fallat</string> + <string name="gpodnetsync_username_characters_error">Noms d\'usuari sols poden contindre lletres, dígits, guions i guions baixos. </string> <!--Directory chooser--> <string name="selected_folder_label">Carpeta seleccionada:</string> <string name="create_folder_label">Crea una carpeta</string> <string name="choose_data_directory">Selecció de la carpeta de dades</string> <string name="choose_data_directory_message">Selecciona l\'arrel del teu directori d\'informació. AntennaPod crearà els subdirectoris pertinents</string> <string name="choose_data_directory_permission_rationale">Es requereix accés a l\'emmagatzematge extern per canviar el directori d\'informació</string> + <string name="choose_data_directory_available_space">%1$s de %2$s lliures</string> <string name="create_folder_msg">Voleu crear una nova carpeta amb el nom \"%1$s\"?</string> <string name="create_folder_success">S\'ha creat la nova carpeta</string> <string name="create_folder_error_no_write_access">No es pot escriure dins d\'aquesta carpeta</string> @@ -560,16 +638,25 @@ <string name="pref_restart_required">AntennaPod s\'ha de reiniciar perquè aquest canvi tingui efecte.</string> <!--Online feed view--> <string name="subscribe_label">Subscriu</string> + <string name="subscribing_label">Subscrivint...</string> + <string name="preview_episode">Vista prelimiar</string> + <string name="stop_preview">Atura vista preliminar</string> <!--Content descriptions for image buttons--> <string name="rewind_label">Rebobina</string> <string name="fast_forward_label">Avança ràpidament</string> + <string name="increase_speed">Augmenta la velocitat</string> + <string name="decrease_speed">Disminueix la velocitat</string> <string name="media_type_audio_label">Àudio</string> <string name="media_type_video_label">Vídeo</string> <string name="navigate_upwards_label">Navega cap amunt</string> <string name="status_downloading_label">S\'està baixant l\'episodi</string> <string name="in_queue_label">S\'ha afegit l\'episodi a la cua</string> + <string name="is_favorite_label">L\'episodi està marcat com a favorit</string> <string name="drag_handle_content_description">Arrossegueu l\'element per canviar-ne la posició</string> <string name="load_next_page_label">Carrega la següent pàgina</string> + <string name="switch_pages">Canvia pàgines</string> + <string name="position">Posició: %1$s</string> + <string name="apply_action">Aplica acció</string> <!--Feed information screen--> <string name="authentication_label">Autenticació</string> <string name="authentication_descr">Canvieu el nom d\'usuari i contrasenya per a aquest podcast i els seus episodis.</string> @@ -580,6 +667,8 @@ <string name="episode_filters_exclude">Exclou</string> <string name="episode_filters_hint">Una paraula \n\"Diverses paraules\"</string> <string name="keep_updated">Manté actualitzat</string> + <string name="keep_updated_summary">Incloure aquest podcast quan (auto-)actualitzen tots els podcasts</string> + <string name="auto_download_disabled_globally">La baixada automàtica està deshabilitada als ajustos generals d\'AntennaPod</string> <!--Progress information--> <string name="progress_upgrading_database">Actualitzant la base de dades</string> <!--AntennaPodSP--> @@ -588,9 +677,12 @@ <string name="search_podcast_hint">Cerca podcast…</string> <string name="search_itunes_label">Cerca a iTunes</string> <string name="search_fyyd_label">Cerca a fyyd</string> + <string name="advanced">Avançat</string> + <string name="add_podcast_by_url">Afegir podcast per URL</string> <string name="browse_gpoddernet_label">Navega gpodder.net</string> <string name="discover">Descobreix</string> <string name="discover_more">més »</string> + <string name="search_powered_by">Cerca feta per %1$s</string> <string name="filter">Filtra</string> <!--Episodes apply actions--> <string name="all_label">Tot</string> @@ -618,6 +710,12 @@ <string name="sort_date_old_new">Data (Antic \u2192 Nou)</string> <string name="sort_duration_short_long">Duració (Curt \u2192 Llarg)</string> <string name="sort_duration_long_short">Duration (Llarg \u2192 Curt)</string> + <string name="sort_a_z">A \u2192 Z</string> + <string name="sort_z_a">Z \u2192 A</string> + <string name="sort_new_old">Nou \u2192 Antic</string> + <string name="sort_old_new">Antic \u2192 Nou</string> + <string name="sort_short_long">Curt \u2192 Llarg</string> + <string name="sort_long_short">Llarg \u2192 Curt</string> <!--Rating dialog--> <string name="rating_title">T\'agrada AntennaPod?</string> <string name="rating_message">Apreciaríem que et prenguessis un temps per valorar AntennaPod</string> @@ -633,6 +731,7 @@ <string name="audio_effects">Efectes de so</string> <string name="stereo_to_mono">Downmix: D\'estereo a mono</string> <string name="sonic_only">Només Sonic</string> + <string name="exoplayer_only">ExoPlayer solament</string> <!--proxy settings--> <string name="proxy_type_label">Tipus</string> <string name="host_label">Host</string> @@ -646,6 +745,7 @@ <string name="proxy_host_invalid_error">El host no és una adreça IP o domini vàlid</string> <string name="proxy_port_invalid_error">El port no és vàlid</string> <!--Subscriptions fragment--> + <string name="subscription_num_columns">Número de columnes</string> <!--Casting--> <string name="cast_media_route_menu_title">Reproduir a...</string> <string name="cast_disconnect_label">Desconnectar la sessió de difusió </string> @@ -669,6 +769,14 @@ <string name="notification_channel_playing_description">Permet controlar la reproducció. Aquesta és la notificació principal que veureu durant la reproducció d\'un podcast.</string> <string name="notification_channel_error">Errors</string> <string name="notification_channel_error_description">Mostrar si quelcom va malament, per exemple si una baixada o sincronització fallen.</string> + <string name="notification_channel_auto_download">Baixades automàtiques</string> + <string name="notification_channel_episode_auto_download">Mostrat quan els episodis han sigut descarregats automàticament</string> <!--Widget settings--> + <string name="widget_settings">Settings del widget</string> + <string name="widget_create_button">Crear widget</string> + <string name="widget_opacity">Opacitat</string> <!--On-Demand configuration--> + <string name="on_demand_config_setting_changed">Ajust actualitzar exitosament</string> + <string name="on_demand_config_stream_text">Pareix que escoltes en línia molt a sovint. Vols que les llistes d\'episodis mostren botons per a escoltar en línia?</string> + <string name="on_demand_config_download_text">Pareix que baixes molt a sovint. Vols que les llistes d\'episodis mostren botons per a baixar episodis?</string> </resources> diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml index 5f956d839..e3a443991 100644 --- a/core/src/main/res/values-es/strings.xml +++ b/core/src/main/res/values-es/strings.xml @@ -509,6 +509,7 @@ <string name="antennapod_version">Versión de AntennaPod</string> <string name="developers">Desarrolladores</string> <string name="translators">Traductores</string> + <string name="special_thanks">Gracias especiales</string> <string name="privacy_policy">Política de privacidad</string> <string name="licenses">Licencias</string> <string name="licenses_summary">AntennaPod usa otros software estupendos</string> @@ -552,6 +553,7 @@ <string name="import_select_file">Seleccionar archivo a importar</string> <string name="import_ok">Importación exitosa.\n\nPulse OK para reiniciar AntennaPod</string> <string name="import_no_downgrade">Esta base de datos fue exportada con una versión más moderna de AntennaPod. La versión instalada no puede manejarla.</string> + <string name="favorites_export_label">Exportar favoritos</string> <!--Sleep timer--> <string name="set_sleeptimer_label">Establecer un temporizador</string> <string name="disable_sleeptimer_label">Desactivar el temporizador</string> diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml index c602960c3..04e4eb695 100644 --- a/core/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -17,7 +17,7 @@ <string name="downloads_log_label">Journal</string> <string name="subscriptions_label">Abonnements</string> <string name="subscriptions_list_label">Liste des abonnements</string> - <string name="cancel_download_label">Annuler les téléchargements</string> + <string name="cancel_download_label">Annuler le téléchargement</string> <string name="playback_history_label">Journal de lecture</string> <string name="gpodnet_main_label">gpodder.net</string> <string name="gpodnet_auth_label">Identifiants gpodder.net</string> diff --git a/core/src/main/res/values-gl/strings.xml b/core/src/main/res/values-gl/strings.xml index 5b8278bbe..a2756cf07 100644 --- a/core/src/main/res/values-gl/strings.xml +++ b/core/src/main/res/values-gl/strings.xml @@ -465,7 +465,7 @@ <string name="pref_smart_mark_as_played_disabled">Desactivado</string> <string name="pref_image_cache_size_title">Tamaño da caché de imaxes</string> <string name="pref_image_cache_size_sum">Tamaño da caché en disco para as imaxes.</string> - <string name="visit_user_forum">Foro de usuarios</string> + <string name="visit_user_forum">Foro de usuarias</string> <string name="bug_report_title">Informar de fallo</string> <string name="open_bug_tracker">Abrir seguimento de fallos</string> <string name="export_logs">Exportar rexistro</string> diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml index 59e3af044..d285f81fb 100644 --- a/core/src/main/res/values-pt-rBR/strings.xml +++ b/core/src/main/res/values-pt-rBR/strings.xml @@ -29,13 +29,13 @@ <string name="total_time_listened_to_podcasts">Tempo total de podcasts reproduzidos:</string> <string name="statistics_details_dialog">%1$d de %2$d episódios iniciados.\n\nReproduzidos %3$s de %4$s.</string> <string name="statistics_mode">Modo Estatística</string> - <string name="statistics_mode_normal">Calcular a duração que já foi tocada. Tocar das vezes é contado o dobro, enquanto marcar como tocada não é contado</string> + <string name="statistics_mode_normal">Calcular a duração que foi realmente tocada. Tocar duas vezes é contado em dobro, enquanto marcar como tocada não é contado</string> <string name="statistics_mode_count_all">Somar todos os podcasts marcados como tocados</string> <string name="statistics_speed_not_counted">Nota: A velocidade de reprodução nunca é levada em conta.</string> <string name="statistics_reset_data">Limpar dados de estatísticas</string> <string name="statistics_reset_data_msg">Isso ira apagar o histórico de reprodução de todos os episódios. Tem certeza que deseja continuar?</string> <!--Download Statistics fragment--> - <string name="total_size_downloaded_podcasts">Tamanho total dos episódios baixados.</string> + <string name="total_size_downloaded_podcasts">Tamanho total dos episódios baixados:</string> <!--Main activity--> <string name="drawer_open">Abrir menu</string> <string name="drawer_close">Fechar menu</string> @@ -502,14 +502,41 @@ <string name="double_tap_toast">Clique novamente no botão voltar para sair</string> <string name="back_button_go_to_page">Vá para a página...</string> <string name="back_button_go_to_page_title">Selecione a página</string> + <string name="pref_delete_removes_from_queue_title">Apagar remove da fila</string> + <string name="pref_delete_removes_from_queue_sum">Remove automaticamente um episódio da fila quando ele é apagado.</string> <!--About screen--> <string name="about_pref">Sobre</string> + <string name="antennapod_version">Versão do AntennaPod</string> + <string name="contributors">Contribuidores</string> + <string name="contributors_summary">Todos podem ajudar a tornar o AntennaPod melhor - com código, traduções ou ajudando os usuários em nosso fórum</string> + <string name="developers">Desenvolvedores</string> + <string name="translators">Tradutores</string> + <string name="special_thanks">Agradecimentos especiais</string> + <string name="privacy_policy">Política de privacidade</string> + <string name="licenses">Licenças</string> + <string name="licenses_summary">O AntennaPod usa outros ótimos softwares</string> <!--Search--> <string name="search_status_no_results">Nenhum resultado encontrado</string> <string name="search_label">Pesquisar</string> <string name="no_results_for_query">Nenhum resultado para \"%1$s\"</string> <!--Synchronization--> + <string name="sync_status_started">Sincronização iniciada</string> + <string name="sync_status_episodes_upload">Enviando mudanças de episódio ...</string> + <string name="sync_status_episodes_download">Baixando mudanças de episódio…</string> + <string name="sync_status_upload_played">Fazendo upload do status de reprodução...</string> + <string name="sync_status_subscriptions">Sincronizando assinaturas...</string> + <string name="sync_status_success">Sincronização bem sucedida</string> + <string name="sync_status_error">Sincronização falhou</string> <!--import and export--> + <string name="import_export_summary">Mover assinaturas e fila para outro dispositivo</string> + <string name="database">Banco de dados</string> + <string name="opml">OPML</string> + <string name="html">HTML</string> + <string name="html_export_summary">Mostre suas assinaturas para um amigo</string> + <string name="opml_export_summary">Transfira suas assinaturas para outro aplicativo de podcast</string> + <string name="opml_import_summary">Importe suas assinaturas de outro aplicativo de podcast</string> + <string name="database_export_summary">Transfira assinaturas, episódios ouvidos e fila para o AntennaPod em outro dispositivo</string> + <string name="database_import_summary">Importar banco de dados AntennaPod de outro dispositivo</string> <string name="opml_import_label">Importação de OPML</string> <string name="opml_reader_error">Um erro ocorreu ao ler o documento OPML:</string> <string name="opml_import_error_no_file">Nenhum arquivo selecionado!</string> @@ -517,17 +544,26 @@ <string name="deselect_all_label">Remover seleção</string> <string name="opml_export_label">Exportar OPML</string> <string name="html_export_label">Exportar HTML</string> + <string name="database_export_label">Exportação do banco de dados</string> + <string name="database_import_label">Importação do banco de dados</string> + <string name="database_import_warning">A importação de um banco de dados substituirá todas as suas assinaturas atuais e histórico de reprodução. Você deve exportar seu banco de dados atual como um backup. Você quer substituir?</string> + <string name="please_wait">Por favor aguarde...</string> <string name="export_error_label">Erro na exportação</string> <string name="export_success_title">Exportado com sucesso</string> <string name="export_success_sum">O arquivo foi exportado para:\n\n%1$s</string> <string name="opml_import_ask_read_permission">Acesso ao armazenamento externo é necessária para ler o arquivo OPML</string> <string name="import_select_file">Selecione arquivo para importar</string> <string name="import_ok">Importado com sucesso.\n\nFavor pressionar OK para reiniciar o AntennaPod</string> + <string name="import_no_downgrade">Este banco de dados foi exportado com uma versão mais recente do AntennaPod. Sua instalação atual ainda não sabe como lidar com este arquivo.</string> + <string name="favorites_export_label">Exportar favoritos</string> + <string name="favorites_export_summary">Exportar favoritos salvos para arquivo</string> <!--Sleep timer--> <string name="set_sleeptimer_label">Configura desligamento automático</string> <string name="disable_sleeptimer_label">Desabilita desligamento automático</string> <string name="sleep_timer_label">Desligamento automático</string> <string name="time_dialog_invalid_input">Entrada inválida, a duração precisa ser um número inteiro</string> + <string name="shake_to_reset_label">Agite para reiniciar</string> + <string name="timer_vibration_label">Vibrar um pouco antes do fim</string> <string name="time_seconds">segundos</string> <string name="time_minutes">minutos</string> <string name="time_hours">horas</string> @@ -576,12 +612,14 @@ <string name="gpodnetsync_error_descr">Ocorreu um erro durante a sincronização:\u0020</string> <string name="gpodnetsync_pref_report_successful">Sucesso</string> <string name="gpodnetsync_pref_report_failed">Falhou</string> + <string name="gpodnetsync_username_characters_error">Os nomes de usuário podem conter apenas letras, dígitos, hifens e sublinhados.</string> <!--Directory chooser--> <string name="selected_folder_label">Selecionar pasta:</string> <string name="create_folder_label">Criar pasta</string> <string name="choose_data_directory">Escolher pasta de dados</string> <string name="choose_data_directory_message">Por favor escolha a raiz da sua pasta de dados. O AntennaPod irá criar os sub-diretórios apropriados.</string> <string name="choose_data_directory_permission_rationale">Acesso ao armazenamento externo é necessário para mudar o repositório de dados</string> + <string name="choose_data_directory_available_space">%1$s de %2$s grátis</string> <string name="create_folder_msg">Criar nova pasta com o nome \"%1$s\"?</string> <string name="create_folder_success">Nova pasta criada</string> <string name="create_folder_error_no_write_access">Não é possível escrever nesta pasta</string> @@ -600,16 +638,25 @@ <string name="pref_restart_required">AntennaPod deve ser reiniciado para que esta mudanças tenha efeito.</string> <!--Online feed view--> <string name="subscribe_label">Assinar</string> + <string name="subscribing_label">Assinando...</string> + <string name="preview_episode">Pré-visualizar</string> + <string name="stop_preview">Parar pré-visualização</string> <!--Content descriptions for image buttons--> <string name="rewind_label">Voltar</string> <string name="fast_forward_label">Avançar</string> + <string name="increase_speed">Aumentar velocidade</string> + <string name="decrease_speed">Diminuir velocidade</string> <string name="media_type_audio_label">Áudio</string> <string name="media_type_video_label">Vídeo</string> <string name="navigate_upwards_label">Navegar para cima</string> <string name="status_downloading_label">O epísódio está sendo baixado</string> <string name="in_queue_label">Episódio está na fila</string> + <string name="is_favorite_label">Episódio está marcado como favorito</string> <string name="drag_handle_content_description">Arraste para mudar a posição deste item</string> <string name="load_next_page_label">Carregar a próxima página</string> + <string name="switch_pages">Trocar páginas</string> + <string name="position">Posição: %1$s</string> + <string name="apply_action">Aplicar ação</string> <!--Feed information screen--> <string name="authentication_label">Autenticação</string> <string name="authentication_descr">Mudar o seu usuário e senha para este podcast e seus episódios.</string> @@ -620,14 +667,22 @@ <string name="episode_filters_exclude">Excluir</string> <string name="episode_filters_hint">Única palavra \n\"Múltiplas palavras\"</string> <string name="keep_updated">Manter Atualizado</string> + <string name="keep_updated_summary">Incluir este podcast ao atualizar todos os podcasts</string> + <string name="auto_download_disabled_globally">O download automático está desativado nas configurações principais do AntennaPod</string> <!--Progress information--> <string name="progress_upgrading_database">Atualizando o banco de dados</string> <!--AntennaPodSP--> <string name="sp_apps_importing_feeds_msg">Importando assinaturas de aplicativos de finalidade única...</string> <!--Add podcast fragment--> + <string name="search_podcast_hint">Procurar podcast...</string> <string name="search_itunes_label">Procurar no iTunes</string> <string name="search_fyyd_label">Pesquisar em fyyd</string> + <string name="advanced">Avançado</string> + <string name="add_podcast_by_url">Adicionar podcast usando uma URL</string> <string name="browse_gpoddernet_label">Pesquisar no gpodder.net</string> + <string name="discover">Descobrir</string> + <string name="discover_more">mais »</string> + <string name="search_powered_by">Pesquisa usando %1$s</string> <string name="filter">Filtrar</string> <!--Episodes apply actions--> <string name="all_label">Todos</string> @@ -655,6 +710,12 @@ <string name="sort_date_old_new">Data (Velho \u2192 Novo)</string> <string name="sort_duration_short_long">Duração (Curta \u2192 Longa)</string> <string name="sort_duration_long_short">Duração (Longa \u2192 Curta)</string> + <string name="sort_a_z">A \u2192 Z</string> + <string name="sort_z_a">Z \u2192 A</string> + <string name="sort_new_old">Novo \u2192 Antigo</string> + <string name="sort_old_new">Antigo \u2192 Novo</string> + <string name="sort_short_long">Curto \u2192 Longo</string> + <string name="sort_long_short">Longo \u2192 Curto</string> <!--Rating dialog--> <string name="rating_title">Gostou do AntennaPod?</string> <string name="rating_message">Nós gostaríamos que você dedicasse um tempo para avaliar o AntennaPod.</string> @@ -708,7 +769,14 @@ <string name="notification_channel_playing_description">Permite controlar a reprodução. Essa é a principal notificação vista ao reproduzir um podcast.</string> <string name="notification_channel_error">Erros</string> <string name="notification_channel_error_description">Exibido caso algo dê errado, por exemplo se houver falha no download ou na sincronização com o gpodder.</string> + <string name="notification_channel_auto_download">Downloads automáticos</string> + <string name="notification_channel_episode_auto_download">Exibido quando os episódios foram baixados automaticamente.</string> <!--Widget settings--> + <string name="widget_settings">Configurações de widgets</string> + <string name="widget_create_button">Criar widget</string> <string name="widget_opacity">Opacidade</string> <!--On-Demand configuration--> + <string name="on_demand_config_setting_changed">Configuração atualizada com sucesso</string> + <string name="on_demand_config_stream_text">Parece que você faz muito stream. Quer que as listas de episódios mostrem botões de stream?</string> + <string name="on_demand_config_download_text">Parece que você faz muitos downloads. Quer que as listas de episódios mostrem botões de download?</string> </resources> diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml index 0b3f88797..c432cab3e 100644 --- a/core/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -29,7 +29,7 @@ <string name="total_time_listened_to_podcasts">Podcast 總播放時長:</string> <string name="statistics_details_dialog">聽過 %1$d/%2$d集。\n\n播過%3$s/%4$s集。</string> <string name="statistics_mode">統計模式</string> - <string name="statistics_mode_normal">計算真實的播放時長。如果播放同一劇集兩遍,則會記錄兩遍的市場。如果只是標記為已播放,則不會被計入播放時長。</string> + <string name="statistics_mode_normal">計算真實的播放時長。如果播放同一劇集兩遍,則會記錄兩遍的時間;如果只是標記為已播放,則不會被計入播放時長</string> <string name="statistics_mode_count_all">累加所有標記為已播放的 Podcast</string> <string name="statistics_speed_not_counted">注意:播放速度不被計入。</string> <string name="statistics_reset_data">重設統計數據</string> @@ -89,7 +89,7 @@ <string name="feed_volume_reduction_off">關閉</string> <string name="feed_volume_reduction_light">輕</string> <string name="feed_volume_reduction_heavy">重</string> - <string name="parallel_downloads_suffix">\u0020同時下載</string> + <string name="parallel_downloads_suffix">目前設定可同步下載 \u0020 集</string> <string name="feed_auto_download_global">預設值</string> <string name="feed_auto_download_always">總是</string> <string name="feed_auto_download_never">不予下載</string> @@ -155,7 +155,7 @@ </plurals> <string name="play_label">播放</string> <string name="pause_label">暫停</string> - <string name="stream_label">流</string> + <string name="stream_label">串流播放</string> <string name="delete_label">刪除</string> <string name="delete_failed">刪除文件失敗。重啟設備試試看。</string> <string name="delete_episode_label">刪除這一集</string> @@ -314,7 +314,7 @@ <!--Preferences--> <string name="storage_pref">儲存空間</string> <string name="storage_sum">自動刪除、匯入、匯出</string> - <string name="project_pref">項目</string> + <string name="project_pref">專案</string> <string name="queue_label">待播清單</string> <string name="synchronization_pref">同步</string> <string name="synchronization_sum">利用 gpodder.net 與其他裝置同步</string> @@ -335,17 +335,17 @@ <string name="pref_pauseOnDisconnect_sum">耳機或藍牙斷開連接時暫停播放</string> <string name="pref_unpauseOnHeadsetReconnect_sum">當耳機再次連接時繼續播放</string> <string name="pref_unpauseOnBluetoothReconnect_sum">當藍牙再次連接時繼續播放</string> - <string name="pref_hardwareForwardButtonSkips_title">快進按鈕跳過</string> + <string name="pref_hardwareForwardButtonSkips_title">快轉鈕視為跳過單集</string> <string name="pref_hardwareForwardButtonSkips_sum">當按下藍牙連接裝置上的快轉鈕時,不要快轉,而是播放下一集</string> - <string name="pref_hardwarePreviousButtonRestarts_title">後退鍵重新播放</string> - <string name="pref_hardwarePreviousButtonRestarts_sum">當按下實體的倒轉鈕時,不要倒轉,而是重新播放本集。</string> + <string name="pref_hardwarePreviousButtonRestarts_title">倒轉鈕視為重新播放</string> + <string name="pref_hardwarePreviousButtonRestarts_sum">當按下實體的倒轉鈕時,不要倒轉,而是重新播放本集</string> <string name="pref_followQueue_sum">當播放完畢時自動跳至待播清單中的下一集</string> <string name="pref_auto_delete_sum">播放完畢後刪除該集</string> <string name="pref_auto_delete_title">自動刪除</string> - <string name="pref_smart_mark_as_played_sum">若離開時還剩下特定秒數以內,也將該集標記為已播放。</string> - <string name="pref_smart_mark_as_played_title">智慧標記為已播放過</string> - <string name="pref_skip_keeps_episodes_sum">當跳過時,保留該集</string> - <string name="pref_skip_keeps_episodes_title">保留跳過</string> + <string name="pref_smart_mark_as_played_sum">若離開時還剩下特定秒數以內,也將該集標記為已播放</string> + <string name="pref_smart_mark_as_played_title">提前視為已播放</string> + <string name="pref_skip_keeps_episodes_sum">當跳過某集不播放時,仍於清單中保留該集</string> + <string name="pref_skip_keeps_episodes_title">保留跳過的單集</string> <string name="pref_favorite_keeps_episodes_sum">保留標記為最愛的各單集</string> <string name="pref_favorite_keeps_episodes_title">保留最愛單集</string> <string name="playback_pref">播放</string> @@ -381,7 +381,7 @@ <string name="pref_nav_drawer_feed_order_title">設定訂閱排序方式</string> <string name="pref_nav_drawer_feed_order_sum">更改您訂閱頻道的排序方式</string> <string name="pref_nav_drawer_feed_counter_title">設定訂閱計數器</string> - <string name="pref_nav_drawer_feed_counter_sum">調整訂閱計數器中要顯示的東西,同時也會在排序方式設定為「計數」時影響排序。</string> + <string name="pref_nav_drawer_feed_counter_sum">調整訂閱計數器中要顯示的東西,同時也會在排序方式設定為「計數」時影響排序</string> <string name="pref_set_theme_sum">更改 AntennaPod 的外觀</string> <string name="pref_automatic_download_title">自動下載</string> <string name="pref_automatic_download_sum">設定單集自動下載機制</string> @@ -389,11 +389,11 @@ <string name="pref_autodl_wifi_filter_sum">限定於特定 Wi-Fi 連線時自動下載</string> <string name="pref_automatic_download_on_battery_title">未充電時下載</string> <string name="pref_automatic_download_on_battery_sum">允許未充電時也自動下載</string> - <string name="pref_parallel_downloads_title">平行下載</string> + <string name="pref_parallel_downloads_title">同步下載</string> <string name="pref_episode_cache_title">暫存集數</string> <string name="pref_episode_cache_summary">在本機中可以暫存的集數,若達上限則將停止自動下載。</string> <string name="pref_episode_cover_title">使用單集的封面圖</string> - <string name="pref_episode_cover_summary">在單集有專屬封面的情況下使用該封面圖。如果取消,則一律使用 Podcast 的封面圖。</string> + <string name="pref_episode_cover_summary">在單集有專屬封面的情況下使用該封面圖。如果取消,則一律使用 Podcast 的封面圖</string> <string name="pref_theme_title_use_system">依據系統設定</string> <string name="pref_theme_title_light">淡色</string> <string name="pref_theme_title_dark">深色</string> @@ -435,17 +435,17 @@ <string name="pref_expandNotify_title">優先通知</string> <string name="pref_expandNotify_sum">此功能通常會加大通知訊息以便顯示控制鈕</string> <string name="pref_persistNotify_title">保留播放控制鈕</string> - <string name="pref_persistNotify_sum">暫停播放時,在通知列及鎖定畫面上保留播放控制鈕。</string> + <string name="pref_persistNotify_sum">暫停播放時,在通知列及鎖定畫面上保留播放控制鈕</string> <string name="pref_compact_notification_buttons_title">設定鎖定畫面按鈕</string> - <string name="pref_compact_notification_buttons_sum">設定鎖定畫面上的播放控制鈕。「暫停/播放」鈕一定會出現。</string> + <string name="pref_compact_notification_buttons_sum">設定鎖定畫面上的播放控制鈕。「暫停/播放」鈕一定會出現</string> <string name="pref_compact_notification_buttons_dialog_title">最多可選擇 %1$d 項</string> <string name="pref_compact_notification_buttons_dialog_error">您最多只能選擇 %1$d 項。</string> <string name="pref_lockscreen_background_title">設定鎖定畫面背景</string> - <string name="pref_lockscreen_background_sum">在鎖定畫面背景採用本單集的圖片,同時也會在第三方 App 裡顯示圖片。</string> + <string name="pref_lockscreen_background_sum">在鎖定畫面背景採用本單集的圖片,同時也會在第三方 App 裡顯示圖片</string> <string name="pref_showDownloadReport_title">顯示下載報告</string> - <string name="pref_showDownloadReport_sum">如果下載失敗,產生錯誤相關細節的報告。</string> + <string name="pref_showDownloadReport_sum">如果下載失敗,產生錯誤相關細節的報告</string> <string name="pref_showAutoDownloadReport_title">顯示自動下載報告</string> - <string name="pref_showAutoDownloadReport_sum">顯示自動下載通知。</string> + <string name="pref_showAutoDownloadReport_sum">顯示自動下載通知</string> <string name="pref_expand_notify_unsupport_toast">Android 4.1 以前尚未支援延伸通知工具。</string> <string name="pref_enqueue_location_title">待播清單新增位置</string> <string name="pref_enqueue_location_sum">將這幾集加到:%1$s</string> @@ -574,7 +574,7 @@ <string name="gpodnet_suggestions_header">建議</string> <string name="gpodnet_search_hint">搜尋 gpodder.net</string> <string name="gpodnetauth_login_title">登入</string> - <string name="gpodnetauth_login_descr">歡迎登入 gpodder.net,請先輸入您的登入資訊:</string> + <string name="gpodnetauth_login_descr">歡迎登入 gpodder.net,請輸入登入資訊:</string> <string name="gpodnetauth_login_butLabel">登入</string> <string name="gpodnetauth_login_register">如果您還沒有帳號,可以先註冊一個:\nhttps://gpodder.net/register/</string> <string name="username_label">帳號</string> @@ -635,6 +635,7 @@ <string name="decrease_speed">放慢</string> <string name="media_type_audio_label">聲音</string> <string name="media_type_video_label">影片</string> + <string name="navigate_upwards_label">Navigate upwards</string> <string name="status_downloading_label">正在下載這集</string> <string name="in_queue_label">單集已在待播清單中</string> <string name="is_favorite_label">已將此單集標為最愛</string> |