6.0.7 commit

This commit is contained in:
Xilin Jia 2024-07-09 14:24:18 +01:00
parent 0575d8f181
commit 069a156d3d
73 changed files with 609 additions and 533 deletions

View File

@ -78,6 +78,7 @@ While podcast subscriptions' OPML files (from AntennaPod or any other sources) c
* in episode list view, if episode has no media, TTS button is shown for fetching transcript (if not exist) and then generating audio file from the transcript. TTS audio files are playable in the same way as local media (with speed setting, pause and rewind/forward)
* Long-press filter button in FeedEpisode view enables/disables filters without changing filter settings
* Subscriptions view has various explicit measures for sorting
* subscriptions sorting is now bi-directional
* in Subscriptions view, click on cover image of a feed opens the FeedInfo view (not FeedEpisodes view)
* History view shows time of last play, and allows filters and sorts
* 5 queues are provided by default: Default queue, and Queues 1-4

View File

@ -125,8 +125,8 @@ android {
buildConfig true
}
defaultConfig {
versionCode 3020206
versionName "6.0.6"
versionCode 3020207
versionName "6.0.7"
applicationId "ac.mdiq.podcini.R"
def commit = ""

View File

@ -12,7 +12,7 @@ import ac.mdiq.podcini.storage.database.Episodes.getEpisodes
import ac.mdiq.podcini.storage.database.Queues.clearQueue
import ac.mdiq.podcini.storage.database.Queues.getInQueueEpisodeIds
import ac.mdiq.podcini.storage.model.EpisodeFilter.Companion.unfiltered
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.activity.MainActivity
import android.content.Context
import android.content.Intent
@ -221,7 +221,7 @@ class PlaybackTest {
EspressoTestUtils.openNavDrawer()
EspressoTestUtils.onDrawerItem(ViewMatchers.withText(R.string.episodes_label)).perform(ViewActions.click())
val episodes = getEpisodes(0, 10, unfiltered(), SortOrder.DATE_NEW_OLD)
val episodes = getEpisodes(0, 10, unfiltered(), EpisodeSortOrder.DATE_NEW_OLD)
val allEpisodesMatcher = Matchers.allOf(ViewMatchers.withId(R.id.recyclerView),
ViewMatchers.isDisplayed(),
ViewMatchers.hasMinimumChildCount(2))
@ -262,7 +262,7 @@ class PlaybackTest {
uiTestUtils!!.addLocalFeedData(true)
runBlocking { clearQueue().join() }
activityTestRule.launchActivity(Intent())
val episodes = getEpisodes(0, 10, unfiltered(), SortOrder.DATE_NEW_OLD)
val episodes = getEpisodes(0, 10, unfiltered(), EpisodeSortOrder.DATE_NEW_OLD)
startLocalPlayback()
val media = episodes[0].media

View File

@ -30,7 +30,7 @@ import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil.hasAlmostEnded
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.utils.NotificationUtils
import ac.mdiq.podcini.util.Logd
import ac.mdiq.podcini.util.event.*
@ -210,7 +210,7 @@ open class SyncService(context: Context, params: WorkerParameters) : Worker(cont
val queuedEpisodeActions: MutableList<EpisodeAction> = synchronizationQueueStorage.queuedEpisodeActions
if (lastSync == 0L) {
EventFlow.postStickyEvent(FlowEvent.SyncServiceEvent(R.string.sync_status_upload_played))
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), SortOrder.DATE_NEW_OLD)
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), EpisodeSortOrder.DATE_NEW_OLD)
Logd(TAG, "First sync. Upload state for all " + readItems.size + " played episodes")
for (item in readItems) {
val media = item.media ?: continue

View File

@ -13,7 +13,7 @@ import ac.mdiq.podcini.storage.database.Episodes.persistEpisode
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil.hasAlmostEnded
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.util.Logd
import ac.mdiq.podcini.util.event.EventFlow
import ac.mdiq.podcini.util.event.FlowEvent
@ -244,9 +244,9 @@ import kotlin.math.min
if (lastSync == 0L) {
EventFlow.postStickyEvent(FlowEvent.SyncServiceEvent(R.string.sync_status_upload_played))
// only push downloaded items
val pausedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PAUSED), SortOrder.DATE_NEW_OLD)
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), SortOrder.DATE_NEW_OLD)
val favoriteItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), SortOrder.DATE_NEW_OLD)
val pausedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PAUSED), EpisodeSortOrder.DATE_NEW_OLD)
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), EpisodeSortOrder.DATE_NEW_OLD)
val favoriteItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), EpisodeSortOrder.DATE_NEW_OLD)
val comItems = mutableSetOf<Episode>()
comItems.addAll(pausedItems)
comItems.addAll(readItems)

View File

@ -2,7 +2,7 @@ package ac.mdiq.podcini.preferences
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.ProxyConfig
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.storage.model.MediaType
import ac.mdiq.podcini.util.Logd
import android.content.Context
@ -38,6 +38,7 @@ object UserPreferences {
const val PREF_TINTED_COLORS: String = "prefTintedColors"
const val PREF_HIDDEN_DRAWER_ITEMS: String = "prefHiddenDrawerItems"
const val PREF_DRAWER_FEED_ORDER: String = "prefDrawerFeedOrder"
const val PREF_DRAWER_FEED_ORDER_DIRECTION: String = "prefDrawerFeedOrderDir"
const val PREF_FEED_GRID_LAYOUT: String = "prefFeedGridLayout"
const val PREF_DRAWER_FEED_COUNTER: String = "prefDrawerFeedIndicator"
const val PREF_EXPANDED_NOTIFICATION: String = "prefExpandNotify"
@ -194,12 +195,18 @@ object UserPreferences {
get() = appPrefs.getBoolean(PREF_OPML_BACKUP, true)
val feedOrder: Int
val feedOrderBy: Int
get() {
val value = appPrefs.getString(PREF_DRAWER_FEED_ORDER, "" + FEED_ORDER_UNPLAYED)
return value!!.toInt()
}
val feedOrderDir: Int
get() {
val value = appPrefs.getInt(PREF_DRAWER_FEED_ORDER_DIRECTION, 0)
return value
}
val useGridLayout: Boolean
get() = appPrefs.getBoolean(PREF_FEED_GRID_LAYOUT, false)
@ -507,7 +514,7 @@ object UserPreferences {
appPrefs.edit().putBoolean(PREF_QUEUE_KEEP_SORTED, keepSorted).apply()
}
var queueKeepSortedOrder: SortOrder?
var queueKeepSortedOrder: EpisodeSortOrder?
/**
* Returns the sort order for the queue keep sorted mode.
* Note: This value is stored independently from the keep sorted state.
@ -515,7 +522,7 @@ object UserPreferences {
*/
get() {
val sortOrderStr = appPrefs.getString(PREF_QUEUE_KEEP_SORTED_ORDER, "use-default")
return SortOrder.parseWithDefault(sortOrderStr, SortOrder.DATE_NEW_OLD)
return EpisodeSortOrder.parseWithDefault(sortOrderStr, EpisodeSortOrder.DATE_NEW_OLD)
}
/**
* Sets the sort order for the queue keep sorted mode.
@ -527,17 +534,17 @@ object UserPreferences {
}
// the sort order for the downloads.
var downloadsSortedOrder: SortOrder?
var downloadsSortedOrder: EpisodeSortOrder?
get() {
val sortOrderStr = appPrefs.getString(PREF_DOWNLOADS_SORTED_ORDER, "" + SortOrder.DATE_NEW_OLD.code)
return SortOrder.fromCodeString(sortOrderStr)
val sortOrderStr = appPrefs.getString(PREF_DOWNLOADS_SORTED_ORDER, "" + EpisodeSortOrder.DATE_NEW_OLD.code)
return EpisodeSortOrder.fromCodeString(sortOrderStr)
}
set(sortOrder) {
appPrefs.edit().putString(PREF_DOWNLOADS_SORTED_ORDER, "" + sortOrder!!.code).apply()
}
var allEpisodesSortOrder: SortOrder?
get() = SortOrder.fromCodeString(appPrefs.getString(PREF_SORT_ALL_EPISODES, "" + SortOrder.DATE_NEW_OLD.code))
var allEpisodesSortOrder: EpisodeSortOrder?
get() = EpisodeSortOrder.fromCodeString(appPrefs.getString(PREF_SORT_ALL_EPISODES, "" + EpisodeSortOrder.DATE_NEW_OLD.code))
set(s) {
appPrefs.edit().putString(PREF_SORT_ALL_EPISODES, "" + s!!.code).apply()
}
@ -597,10 +604,13 @@ object UserPreferences {
return appPrefs.getBoolean(PREF_SHOW_TIME_LEFT, false)
}
fun setFeedOrder(selected: String?) {
fun setFeedOrder(selected: String, dir: Int) {
appPrefs.edit()
.putString(PREF_DRAWER_FEED_ORDER, selected)
.apply()
appPrefs.edit()
.putInt(PREF_DRAWER_FEED_ORDER_DIRECTION, dir)
.apply()
}
fun enqueueDownloadedEpisodes(): Boolean {

View File

@ -19,7 +19,7 @@ import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.preferences.OpmlTransporter.*
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil.hasAlmostEnded
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.activity.OpmlImportActivity
import ac.mdiq.podcini.ui.activity.PreferenceActivity
import ac.mdiq.podcini.util.Logd
@ -732,9 +732,9 @@ class ImportExportPreferencesFragment : PreferenceFragmentCompat() {
override fun writeDocument(feeds: List<Feed?>?, writer: Writer?, context: Context) {
Logd(TAG, "Starting to write document")
val queuedEpisodeActions: MutableList<EpisodeAction> = mutableListOf()
val pausedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PAUSED), SortOrder.DATE_NEW_OLD)
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), SortOrder.DATE_NEW_OLD)
val favoriteItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), SortOrder.DATE_NEW_OLD)
val pausedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PAUSED), EpisodeSortOrder.DATE_NEW_OLD)
val readItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.PLAYED), EpisodeSortOrder.DATE_NEW_OLD)
val favoriteItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), EpisodeSortOrder.DATE_NEW_OLD)
val comItems = mutableSetOf<Episode>()
comItems.addAll(pausedItems)
comItems.addAll(readItems)
@ -793,7 +793,7 @@ class ImportExportPreferencesFragment : PreferenceFragmentCompat() {
val favTemplate = IOUtils.toString(favTemplateStream, UTF_8)
val feedTemplateStream = context.assets.open(FEED_TEMPLATE)
val feedTemplate = IOUtils.toString(feedTemplateStream, UTF_8)
val allFavorites = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), SortOrder.DATE_NEW_OLD)
val allFavorites = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.IS_FAVORITE), EpisodeSortOrder.DATE_NEW_OLD)
val favoritesByFeed = buildFeedMap(allFavorites)
writer!!.append(templateParts[0])
for (feedId in favoritesByFeed.keys) {

View File

@ -6,7 +6,7 @@ import ac.mdiq.podcini.preferences.UserPreferences.fullNotificationButtons
import ac.mdiq.podcini.preferences.UserPreferences.setShowRemainTimeSetting
import ac.mdiq.podcini.ui.activity.PreferenceActivity
import ac.mdiq.podcini.ui.dialog.DrawerPreferencesDialog
import ac.mdiq.podcini.ui.dialog.FeedSortDialog
import ac.mdiq.podcini.ui.dialog.FeedSortDialogNew
import ac.mdiq.podcini.util.event.EventFlow
import ac.mdiq.podcini.util.event.FlowEvent
import android.content.Context
@ -66,7 +66,8 @@ class UserInterfacePreferencesFragment : PreferenceFragmentCompat() {
// })
findPreference<Preference>(UserPreferences.PREF_DRAWER_FEED_ORDER)?.onPreferenceClickListener = (Preference.OnPreferenceClickListener {
FeedSortDialog.showDialog(requireContext())
// FeedSortDialog.showDialog(requireContext())
FeedSortDialogNew().show(childFragmentManager, "FeedSortDialog")
true
})
findPreference<Preference>(PREF_SWIPE)?.setOnPreferenceClickListener {

View File

@ -10,7 +10,7 @@ import ac.mdiq.podcini.storage.database.Episodes.getEpisodesCount
import ac.mdiq.podcini.storage.database.Queues.getInQueueEpisodeIds
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import android.content.Context
import android.util.Log
import androidx.annotation.OptIn
@ -52,7 +52,7 @@ object AutoCleanups {
private val candidates: List<Episode>
get() {
val candidates: MutableList<Episode> = ArrayList()
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), SortOrder.DATE_NEW_OLD)
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), EpisodeSortOrder.DATE_NEW_OLD)
for (item in downloadedItems) {
if (item.media != null && item.media!!.downloaded && !item.isFavorite) candidates.add(item)
}
@ -110,7 +110,7 @@ object AutoCleanups {
private val candidates: List<Episode>
get() {
val candidates: MutableList<Episode> = ArrayList()
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), SortOrder.DATE_NEW_OLD)
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), EpisodeSortOrder.DATE_NEW_OLD)
val idsInQueues = getInQueueEpisodeIds()
for (item in downloadedItems) {
if (item.media != null && item.media!!.downloaded && !idsInQueues.contains(item.id) && !item.isFavorite)
@ -187,7 +187,7 @@ object AutoCleanups {
private val candidates: List<Episode>
get() {
val candidates: MutableList<Episode> = ArrayList()
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), SortOrder.DATE_NEW_OLD)
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), EpisodeSortOrder.DATE_NEW_OLD)
val idsInQueues = getInQueueEpisodeIds()
val mostRecentDateForDeletion = calcMostRecentDateForDeletion(Date())
for (item in downloadedItems) {

View File

@ -12,7 +12,7 @@ import ac.mdiq.podcini.storage.database.Episodes.getEpisodes
import ac.mdiq.podcini.storage.database.Episodes.getEpisodesCount
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.util.Logd
import android.content.Context
import android.content.Intent
@ -80,7 +80,7 @@ object AutoDownloads {
Logd(TAG, "Performing auto-dl of undownloaded episodes")
val candidates: MutableList<Episode>
val queue = curQueue.episodes
val newItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.NEW), SortOrder.DATE_NEW_OLD)
val newItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.NEW), EpisodeSortOrder.DATE_NEW_OLD)
Logd(TAG, "newItems: ${newItems.size}")
candidates = ArrayList(queue.size + newItems.size)
candidates.addAll(queue)

View File

@ -20,7 +20,7 @@ import ac.mdiq.podcini.storage.database.RealmDB.upsertBlk
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.util.IntentUtils.sendLocalBroadcast
import ac.mdiq.podcini.util.Logd
import ac.mdiq.podcini.util.event.EventFlow
@ -48,7 +48,7 @@ object Episodes {
* @param filter The filter describing which episodes to filter out.
* TODO: filters of queued and notqueued don't work in this
*/
fun getEpisodes(offset: Int, limit: Int, filter: EpisodeFilter?, sortOrder: SortOrder?, copy: Boolean = true): List<Episode> {
fun getEpisodes(offset: Int, limit: Int, filter: EpisodeFilter?, sortOrder: EpisodeSortOrder?, copy: Boolean = true): List<Episode> {
Logd(TAG, "getEpisodes called with: offset=$offset, limit=$limit")
val queryString = filter?.queryString()?:"id > 0"
var episodes = realm.query(Episode::class).query(queryString).find().toMutableList()

View File

@ -72,7 +72,7 @@ object Feeds {
for (feed in feedsCopy) {
if (feed.preferences != null) tagsSet.addAll(feed.preferences!!.tags.filter { it != TAG_ROOT })
}
val newTags = tagsSet.intersect(tags.toSet())
val newTags = tagsSet - tags.toSet()
if (newTags.isNotEmpty()) {
tags.clear()
tags.addAll(tagsSet)

View File

@ -17,7 +17,7 @@ import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.PlayQueue
import ac.mdiq.podcini.storage.model.Playable
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.util.Logd
import ac.mdiq.podcini.util.event.EventFlow
import ac.mdiq.podcini.util.event.FlowEvent
@ -126,7 +126,7 @@ object Queues {
// Sort queue by configured sort order
val sortOrder = queueKeepSortedOrder
// do not shuffle the list on every change
if (sortOrder == SortOrder.RANDOM) return
if (sortOrder == EpisodeSortOrder.RANDOM) return
if (sortOrder != null) {
val permutor = getPermutor(sortOrder)

View File

@ -3,7 +3,7 @@ package ac.mdiq.podcini.storage.model
/**
* Provides sort orders to sort a list of episodes.
*/
enum class SortOrder(@JvmField val code: Int, @JvmField val scope: Scope) {
enum class EpisodeSortOrder(@JvmField val code: Int, @JvmField val scope: Scope) {
DATE_OLD_NEW(1, Scope.INTRA_FEED),
DATE_NEW_OLD(2, Scope.INTRA_FEED),
EPISODE_TITLE_A_Z(3, Scope.INTRA_FEED),
@ -35,7 +35,7 @@ enum class SortOrder(@JvmField val code: Int, @JvmField val scope: Scope) {
* Converts the string representation to its enum value. If the string value is unknown,
* the given default value is returned.
*/
fun parseWithDefault(value: String?, defaultValue: SortOrder): SortOrder {
fun parseWithDefault(value: String?, defaultValue: EpisodeSortOrder): EpisodeSortOrder {
return try {
valueOf(value!!)
} catch (e: IllegalArgumentException) {
@ -44,7 +44,7 @@ enum class SortOrder(@JvmField val code: Int, @JvmField val scope: Scope) {
}
@JvmStatic
fun fromCodeString(codeStr: String?): SortOrder? {
fun fromCodeString(codeStr: String?): EpisodeSortOrder? {
if (codeStr.isNullOrEmpty()) return null
val code = codeStr.toInt()
@ -55,17 +55,17 @@ enum class SortOrder(@JvmField val code: Int, @JvmField val scope: Scope) {
}
@JvmStatic
fun fromCode(code: Int): SortOrder? {
return enumValues<SortOrder>().firstOrNull { it.code == code }
fun fromCode(code: Int): EpisodeSortOrder? {
return enumValues<EpisodeSortOrder>().firstOrNull { it.code == code }
}
@JvmStatic
fun toCodeString(sortOrder: SortOrder?): String? {
fun toCodeString(sortOrder: EpisodeSortOrder?): String? {
return sortOrder?.code?.toString()
}
fun valuesOf(stringValues: Array<String?>): Array<SortOrder?> {
val values = arrayOfNulls<SortOrder>(stringValues.size)
fun valuesOf(stringValues: Array<String?>): Array<EpisodeSortOrder?> {
val values = arrayOfNulls<EpisodeSortOrder>(stringValues.size)
for (i in stringValues.indices) {
values[i] = valueOf(stringValues[i]!!)
}

View File

@ -1,7 +1,7 @@
package ac.mdiq.podcini.storage.model
import ac.mdiq.podcini.storage.model.FeedFunding.Companion.extractPaymentLinks
import ac.mdiq.podcini.storage.model.SortOrder.Companion.fromCode
import ac.mdiq.podcini.storage.model.EpisodeSortOrder.Companion.fromCode
import io.realm.kotlin.ext.realmListOf
import io.realm.kotlin.types.RealmList
import io.realm.kotlin.types.RealmObject
@ -122,7 +122,7 @@ class Feed : RealmObject {
get() = EpisodeFilter(preferences?.filterString ?: "")
@Ignore
var sortOrder: SortOrder? = null
var sortOrder: EpisodeSortOrder? = null
get() = fromCode(preferences?.sortOrderCode ?: 0)
set(value) {
if (value == null) return

View File

@ -0,0 +1,26 @@
package ac.mdiq.podcini.storage.model
enum class FeedSortOrder(val code: Int, val index: Int) {
UNPLAYED_NEW_OLD(1, 0),
UNPLAYED_OLD_NEW(2, 0),
ALPHABETIC_A_Z(3, 1),
ALPHABETIC_Z_A(4,1 ),
LAST_UPDATED_NEW_OLD(5, 2),
LAST_UPDATED_OLD_NEW(6, 2),
LAST_UPDATED_UNPLAYED_NEW_OLD(7, 3),
LAST_UPDATED_UNPLAYED_OLD_NEW(8, 3),
MOST_PLAYED(9, 4),
LEAST_PLAYED(10, 4),
MOST_DOWNLOADED(11, 5),
LEAST_DOWNLAODED(12, 5),
MOST_DOWNLOADED_UNPLAYED(13, 6),
LEAST_DOWNLAODED_UNPLAYED(14, 6),
NEW_EPISODES_MOST(15, 7),
NEW_EPISODES_LEAST(16, 7);
companion object {
fun getSortOrder(dir: Int, index: Int): FeedSortOrder? {
return enumValues<FeedSortOrder>().firstOrNull { it.code == 2*index+dir+1 && it.index == index }
}
}
}

View File

@ -19,6 +19,7 @@ import ac.mdiq.podcini.preferences.UserPreferences.defaultPage
import ac.mdiq.podcini.preferences.UserPreferences.hiddenDrawerItems
import ac.mdiq.podcini.receiver.MediaButtonReceiver.Companion.createIntent
import ac.mdiq.podcini.receiver.PlayerWidget
import ac.mdiq.podcini.storage.database.Feeds.buildTags
import ac.mdiq.podcini.storage.database.Feeds.monitorFeeds
import ac.mdiq.podcini.storage.database.RealmDB.runOnIOScope
import ac.mdiq.podcini.ui.actions.swipeactions.SwipeActions
@ -130,6 +131,7 @@ class MainActivity : CastEnabledActivity() {
SwipeActions.getSharedPrefs(this@MainActivity)
QueueFragment.getSharedPrefs(this@MainActivity)
// updateFeedMap()
buildTags()
monitorFeeds()
// InTheatre.apply { }
PlayerDetailsFragment.getSharedPrefs(this@MainActivity)
@ -403,7 +405,7 @@ class MainActivity : CastEnabledActivity() {
val playerView = findViewById<FragmentContainerView>(R.id.playerFragment1)
val playerParams = playerView?.layoutParams as? MarginLayoutParams
playerParams?.setMargins(navigationBarInsets.left, 0, navigationBarInsets.right, 0)
playerView.layoutParams = playerParams
playerView?.layoutParams = playerParams
audioPlayerView.visibility = if (visible) View.VISIBLE else View.GONE
}

View File

@ -4,7 +4,7 @@ import ac.mdiq.podcini.R
import ac.mdiq.podcini.databinding.SortDialogBinding
import ac.mdiq.podcini.databinding.SortDialogItemActiveBinding
import ac.mdiq.podcini.databinding.SortDialogItemBinding
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
@ -22,7 +22,7 @@ open class EpisodeSortDialog : BottomSheetDialogFragment() {
protected var _binding: SortDialogBinding? = null
protected val binding get() = _binding!!
protected var sortOrder: SortOrder? = null
protected var sortOrder: EpisodeSortOrder? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = SortDialogBinding.inflate(inflater)
@ -38,22 +38,22 @@ open class EpisodeSortDialog : BottomSheetDialogFragment() {
private fun populateList() {
binding.gridLayout.removeAllViews()
onAddItem(R.string.episode_title, SortOrder.EPISODE_TITLE_A_Z, SortOrder.EPISODE_TITLE_Z_A, true)
onAddItem(R.string.feed_title, SortOrder.FEED_TITLE_A_Z, SortOrder.FEED_TITLE_Z_A, true)
onAddItem(R.string.duration, SortOrder.DURATION_SHORT_LONG, SortOrder.DURATION_LONG_SHORT, true)
onAddItem(R.string.publish_date, SortOrder.DATE_OLD_NEW, SortOrder.DATE_NEW_OLD, false)
onAddItem(R.string.last_played_date, SortOrder.PLAYED_DATE_OLD_NEW, SortOrder.PLAYED_DATE_NEW_OLD, false)
onAddItem(R.string.completed_date, SortOrder.COMPLETED_DATE_OLD_NEW, SortOrder.COMPLETED_DATE_NEW_OLD, false)
onAddItem(R.string.size, SortOrder.SIZE_SMALL_LARGE, SortOrder.SIZE_LARGE_SMALL, false)
onAddItem(R.string.filename, SortOrder.EPISODE_FILENAME_A_Z, SortOrder.EPISODE_FILENAME_Z_A, true)
onAddItem(R.string.random, SortOrder.RANDOM, SortOrder.RANDOM, true)
onAddItem(R.string.smart_shuffle, SortOrder.SMART_SHUFFLE_OLD_NEW, SortOrder.SMART_SHUFFLE_NEW_OLD, false)
onAddItem(R.string.episode_title, EpisodeSortOrder.EPISODE_TITLE_A_Z, EpisodeSortOrder.EPISODE_TITLE_Z_A, true)
onAddItem(R.string.feed_title, EpisodeSortOrder.FEED_TITLE_A_Z, EpisodeSortOrder.FEED_TITLE_Z_A, true)
onAddItem(R.string.duration, EpisodeSortOrder.DURATION_SHORT_LONG, EpisodeSortOrder.DURATION_LONG_SHORT, true)
onAddItem(R.string.publish_date, EpisodeSortOrder.DATE_OLD_NEW, EpisodeSortOrder.DATE_NEW_OLD, false)
onAddItem(R.string.last_played_date, EpisodeSortOrder.PLAYED_DATE_OLD_NEW, EpisodeSortOrder.PLAYED_DATE_NEW_OLD, false)
onAddItem(R.string.completed_date, EpisodeSortOrder.COMPLETED_DATE_OLD_NEW, EpisodeSortOrder.COMPLETED_DATE_NEW_OLD, false)
onAddItem(R.string.size, EpisodeSortOrder.SIZE_SMALL_LARGE, EpisodeSortOrder.SIZE_LARGE_SMALL, false)
onAddItem(R.string.filename, EpisodeSortOrder.EPISODE_FILENAME_A_Z, EpisodeSortOrder.EPISODE_FILENAME_Z_A, true)
onAddItem(R.string.random, EpisodeSortOrder.RANDOM, EpisodeSortOrder.RANDOM, true)
onAddItem(R.string.smart_shuffle, EpisodeSortOrder.SMART_SHUFFLE_OLD_NEW, EpisodeSortOrder.SMART_SHUFFLE_NEW_OLD, false)
}
protected open fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
protected open fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (sortOrder == ascending || sortOrder == descending) {
val item = SortDialogItemActiveBinding.inflate(layoutInflater, binding.gridLayout, false)
val other: SortOrder
val other: EpisodeSortOrder
when {
ascending == descending -> {
item.button.setText(title)

View File

@ -1,33 +0,0 @@
package ac.mdiq.podcini.ui.dialog
import ac.mdiq.podcini.R
import ac.mdiq.podcini.preferences.UserPreferences.feedOrder
import ac.mdiq.podcini.preferences.UserPreferences.setFeedOrder
import ac.mdiq.podcini.util.event.EventFlow
import ac.mdiq.podcini.util.event.FlowEvent
import android.content.Context
import android.content.DialogInterface
import com.google.android.material.dialog.MaterialAlertDialogBuilder
object FeedSortDialog {
fun showDialog(context: Context) {
val dialog = MaterialAlertDialogBuilder(context)
dialog.setTitle(context.getString(R.string.pref_nav_drawer_feed_order_title))
dialog.setNegativeButton(android.R.string.cancel) { d: DialogInterface, _: Int -> d.dismiss() }
val selected = feedOrder
val entryValues = listOf(*context.resources.getStringArray(R.array.nav_drawer_feed_order_values))
val selectedIndex = entryValues.indexOf("" + selected)
val items = context.resources.getStringArray(R.array.nav_drawer_feed_order_options)
dialog.setSingleChoiceItems(items, selectedIndex) { d: DialogInterface, which: Int ->
if (selectedIndex != which) {
setFeedOrder(entryValues[which])
//Update subscriptions
EventFlow.postEvent(FlowEvent.FeedsSortedEvent())
}
d.dismiss()
}
dialog.show()
}
}

View File

@ -0,0 +1,133 @@
package ac.mdiq.podcini.ui.dialog
import ac.mdiq.podcini.R
import ac.mdiq.podcini.databinding.SortDialogBinding
import ac.mdiq.podcini.databinding.SortDialogItemActiveBinding
import ac.mdiq.podcini.databinding.SortDialogItemBinding
import ac.mdiq.podcini.preferences.UserPreferences.feedOrderBy
import ac.mdiq.podcini.preferences.UserPreferences.feedOrderDir
import ac.mdiq.podcini.preferences.UserPreferences.setFeedOrder
import ac.mdiq.podcini.storage.model.FeedSortOrder
import ac.mdiq.podcini.storage.model.FeedSortOrder.Companion.getSortOrder
import ac.mdiq.podcini.util.Logd
import ac.mdiq.podcini.util.event.EventFlow
import ac.mdiq.podcini.util.event.FlowEvent
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.CompoundButton
import android.widget.FrameLayout
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
open class FeedSortDialogNew : BottomSheetDialogFragment() {
private val TAG: String = FeedSortDialogNew::class.simpleName ?: "Anonymous"
protected var _binding: SortDialogBinding? = null
protected val binding get() = _binding!!
protected var sortOrder: FeedSortOrder? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sortOrder = getSortOrder(feedOrderDir, feedOrderBy)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = SortDialogBinding.inflate(inflater)
populateList()
binding.keepSortedCheckbox.setOnCheckedChangeListener { _: CompoundButton?, _: Boolean -> this@FeedSortDialogNew.onSelectionChanged() }
return binding.root
}
override fun onStart() {
super.onStart()
dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
}
private fun populateList() {
binding.gridLayout.removeAllViews()
onAddItem(R.string.feed_order_unplayed_count, FeedSortOrder.UNPLAYED_OLD_NEW, FeedSortOrder.UNPLAYED_NEW_OLD, false)
onAddItem(R.string.feed_order_alphabetical, FeedSortOrder.ALPHABETIC_A_Z, FeedSortOrder.ALPHABETIC_Z_A, true)
onAddItem(R.string.feed_order_last_update, FeedSortOrder.LAST_UPDATED_OLD_NEW, FeedSortOrder.LAST_UPDATED_NEW_OLD, false)
onAddItem(R.string.feed_order_last_unread_update, FeedSortOrder.LAST_UPDATED_UNPLAYED_OLD_NEW, FeedSortOrder.LAST_UPDATED_UNPLAYED_NEW_OLD, false)
onAddItem(R.string.feed_order_most_played, FeedSortOrder.LEAST_PLAYED, FeedSortOrder.MOST_PLAYED, false)
onAddItem(R.string.feed_counter_downloaded, FeedSortOrder.LEAST_DOWNLAODED, FeedSortOrder.MOST_DOWNLOADED, false)
onAddItem(R.string.feed_counter_downloaded_unplayed, FeedSortOrder.LEAST_DOWNLAODED_UNPLAYED, FeedSortOrder.MOST_DOWNLOADED_UNPLAYED, false)
onAddItem(R.string.feed_order_new_episodes, FeedSortOrder.NEW_EPISODES_LEAST, FeedSortOrder.NEW_EPISODES_MOST, false)
}
protected open fun onAddItem(title: Int, ascending: FeedSortOrder, descending: FeedSortOrder, ascendingIsDefault: Boolean) {
Logd(TAG, "onAddItem $title")
if (sortOrder == ascending || sortOrder == descending) {
val item = SortDialogItemActiveBinding.inflate(layoutInflater, binding.gridLayout, false)
val other: FeedSortOrder
when {
ascending == descending -> {
item.button.setText(title)
other = ascending
}
sortOrder == ascending -> {
item.button.text = getString(title) + "\u00A0"
other = descending
}
else -> {
item.button.text = getString(title) + "\u00A0"
other = ascending
}
}
item.button.setOnClickListener {
Logd(TAG, "button clicked: $title ${other.name} ${other.code}")
sortOrder = other
populateList()
setFeedOrder(sortOrder!!.index.toString(), if (sortOrder == ascending) 0 else 1)
onSelectionChanged()
EventFlow.postEvent(FlowEvent.FeedsSortedEvent())
}
binding.gridLayout.addView(item.root)
} else {
val item = SortDialogItemBinding.inflate(layoutInflater, binding.gridLayout, false)
item.button.setText(title)
item.button.setOnClickListener {
sortOrder = if (ascendingIsDefault) ascending else descending
Logd(TAG, "button clicked 1: ${getString(title)} ${sortOrder!!.name} ${sortOrder!!.code}")
populateList()
setFeedOrder(sortOrder!!.index.toString(), if (sortOrder == ascending) 0 else 1)
onSelectionChanged()
EventFlow.postEvent(FlowEvent.FeedsSortedEvent())
}
binding.gridLayout.addView(item.root)
}
}
protected open fun onSelectionChanged() {}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.setOnShowListener { dialogInterface: DialogInterface ->
val bottomSheetDialog = dialogInterface as BottomSheetDialog
setupFullHeight(bottomSheetDialog)
}
return dialog
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
private fun setupFullHeight(bottomSheetDialog: BottomSheetDialog) {
val bottomSheet = bottomSheetDialog.findViewById<FrameLayout>(com.leinardi.android.speeddial.R.id.design_bottom_sheet)
if (bottomSheet != null) {
val behavior = BottomSheetBehavior.from(bottomSheet)
val layoutParams = bottomSheet.layoutParams
bottomSheet.layoutParams = layoutParams
behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
}
}

View File

@ -6,10 +6,13 @@ import ac.mdiq.podcini.storage.database.Feeds.buildTags
import ac.mdiq.podcini.storage.database.Feeds.getTags
import ac.mdiq.podcini.storage.database.Feeds.persistFeedPreferences
import ac.mdiq.podcini.storage.database.RealmDB.unmanaged
import ac.mdiq.podcini.storage.database.RealmDB.upsert
import ac.mdiq.podcini.storage.database.RealmDB.upsertBlk
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.FeedPreferences
import ac.mdiq.podcini.ui.adapter.SimpleChipAdapter
import ac.mdiq.podcini.ui.utils.ItemOffsetDecoration
import ac.mdiq.podcini.util.Logd
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
@ -53,7 +56,6 @@ class TagSettingsDialog : DialogFragment() {
}
}
binding.tagsRecycler.adapter = adapter
// binding.rootFolderCheckbox.isChecked = commonTags.contains(FeedPreferences.TAG_ROOT)
binding.newTagTextInput.setEndIconOnClickListener {
addTag(binding.newTagEditText.text.toString().trim { it <= ' ' })
@ -76,14 +78,12 @@ class TagSettingsDialog : DialogFragment() {
addTag(binding.newTagEditText.text.toString().trim { it <= ' ' })
updatePreferencesTags(commonTags)
buildTags()
// EventFlow.postEvent(FlowEvent.FeedTagsChangedEvent())
}
dialog.setNegativeButton(R.string.cancel_label, null)
return dialog.create()
}
private fun loadTags() {
// val scope = CoroutineScope(Dispatchers.Main)
val acAdapter = ArrayAdapter(requireContext(), R.layout.single_tag_text_view, getTags())
binding.newTagEditText.setAdapter(acAdapter)
}
@ -102,16 +102,13 @@ class TagSettingsDialog : DialogFragment() {
}
@OptIn(UnstableApi::class) private fun updatePreferencesTags(commonTags: Set<String>) {
// if (binding.rootFolderCheckbox.isChecked) {
// displayedTags.add(FeedPreferences.TAG_ROOT)
// }
for (feed_ in feedList) {
val feed = unmanaged(feed_)
if (feed.preferences != null) {
feed.preferences!!.tags.removeAll(commonTags)
feed.preferences!!.tags.addAll(displayedTags)
persistFeedPreferences(feed)
// EventFlow.postEvent(FlowEvent.FeedPrefsChangeEvent(feed))
for (f in feedList) {
Logd(TAG, "${f.title} $displayedTags")
upsertBlk(f) {
if (it.preferences != null) {
it.preferences!!.tags.removeAll(commonTags)
it.preferences!!.tags.addAll(displayedTags)
}
}
}
}

View File

@ -7,7 +7,7 @@ import ac.mdiq.podcini.net.feed.discovery.*
import ac.mdiq.podcini.net.feed.FeedUpdateManager
import ac.mdiq.podcini.storage.database.Feeds.updateFeed
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.activity.MainActivity
import ac.mdiq.podcini.ui.activity.OpmlImportActivity
import ac.mdiq.podcini.util.Logd
@ -193,7 +193,7 @@ class AddFeedFragment : Fragment() {
val dirFeed = Feed(Feed.PREFIX_LOCAL_FOLDER + uri.toString(), null, title)
dirFeed.episodes.clear()
dirFeed.sortOrder = SortOrder.EPISODE_TITLE_A_Z
dirFeed.sortOrder = EpisodeSortOrder.EPISODE_TITLE_A_Z
val fromDatabase: Feed? = updateFeed(requireContext(), dirFeed, false)
FeedUpdateManager.runOnce(requireContext(), fromDatabase)
return fromDatabase

View File

@ -7,7 +7,7 @@ import ac.mdiq.podcini.storage.database.Episodes.getEpisodes
import ac.mdiq.podcini.storage.database.Episodes.getEpisodesCount
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.activity.MainActivity
import ac.mdiq.podcini.ui.dialog.EpisodeFilterDialog
import ac.mdiq.podcini.ui.dialog.EpisodeSortDialog
@ -146,9 +146,9 @@ import kotlin.math.min
super.onCreate(savedInstanceState)
sortOrder = allEpisodesSortOrder
}
override fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG
|| ascending == SortOrder.PLAYED_DATE_OLD_NEW || ascending == SortOrder.COMPLETED_DATE_OLD_NEW)
override fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (ascending == EpisodeSortOrder.DATE_OLD_NEW || ascending == EpisodeSortOrder.DURATION_SHORT_LONG
|| ascending == EpisodeSortOrder.PLAYED_DATE_OLD_NEW || ascending == EpisodeSortOrder.COMPLETED_DATE_OLD_NEW)
super.onAddItem(title, ascending, descending, ascendingIsDefault)
}
override fun onSelectionChanged() {

View File

@ -13,7 +13,7 @@ import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.actions.EpisodeMultiSelectHandler
import ac.mdiq.podcini.ui.actions.actionbutton.DeleteActionButton
import ac.mdiq.podcini.ui.actions.menuhandler.EpisodeMenuHandler
@ -323,7 +323,7 @@ import java.util.*
lifecycleScope.launch {
try {
withContext(Dispatchers.IO) {
val sortOrder: SortOrder? = UserPreferences.downloadsSortedOrder
val sortOrder: EpisodeSortOrder? = UserPreferences.downloadsSortedOrder
val downloadedItems = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), sortOrder)
if (runningDownloads.isEmpty()) episodes = downloadedItems.toMutableList()
else {
@ -411,11 +411,11 @@ import java.util.*
sortOrder = UserPreferences.downloadsSortedOrder
}
override fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.PLAYED_DATE_OLD_NEW
|| ascending == SortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == SortOrder.DURATION_SHORT_LONG || ascending == SortOrder.EPISODE_TITLE_A_Z
|| ascending == SortOrder.SIZE_SMALL_LARGE || ascending == SortOrder.FEED_TITLE_A_Z) {
override fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (ascending == EpisodeSortOrder.DATE_OLD_NEW || ascending == EpisodeSortOrder.PLAYED_DATE_OLD_NEW
|| ascending == EpisodeSortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == EpisodeSortOrder.DURATION_SHORT_LONG || ascending == EpisodeSortOrder.EPISODE_TITLE_A_Z
|| ascending == EpisodeSortOrder.SIZE_SMALL_LARGE || ascending == EpisodeSortOrder.FEED_TITLE_A_Z) {
super.onAddItem(title, ascending, descending, ascendingIsDefault)
}
}

View File

@ -20,8 +20,8 @@ import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.SortOrder.Companion.fromCode
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder.Companion.fromCode
import ac.mdiq.podcini.ui.actions.EpisodeMultiSelectHandler
import ac.mdiq.podcini.ui.actions.menuhandler.EpisodeMenuHandler
import ac.mdiq.podcini.ui.actions.menuhandler.MenuItemUtils
@ -698,13 +698,13 @@ import java.util.concurrent.Semaphore
class SingleFeedSortDialog(val feed: Feed?) : EpisodeSortDialog() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sortOrder = feed?.sortOrder ?: SortOrder.DATE_NEW_OLD
sortOrder = feed?.sortOrder ?: EpisodeSortOrder.DATE_NEW_OLD
}
override fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.PLAYED_DATE_OLD_NEW || ascending == SortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == SortOrder.DURATION_SHORT_LONG || ascending == SortOrder.RANDOM
|| ascending == SortOrder.EPISODE_TITLE_A_Z
|| (feed?.isLocalFeed == true && ascending == SortOrder.EPISODE_FILENAME_A_Z)) {
override fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (ascending == EpisodeSortOrder.DATE_OLD_NEW || ascending == EpisodeSortOrder.PLAYED_DATE_OLD_NEW || ascending == EpisodeSortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == EpisodeSortOrder.DURATION_SHORT_LONG || ascending == EpisodeSortOrder.RANDOM
|| ascending == EpisodeSortOrder.EPISODE_TITLE_A_Z
|| (feed?.isLocalFeed == true && ascending == EpisodeSortOrder.EPISODE_FILENAME_A_Z)) {
super.onAddItem(title, ascending, descending, ascendingIsDefault)
}
}

View File

@ -5,7 +5,7 @@ import ac.mdiq.podcini.storage.database.RealmDB.realm
import ac.mdiq.podcini.storage.database.RealmDB.runOnIOScope
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.actions.menuhandler.MenuItemUtils
import ac.mdiq.podcini.ui.activity.MainActivity
import ac.mdiq.podcini.ui.adapter.EpisodesAdapter
@ -32,7 +32,7 @@ import kotlin.math.min
@UnstableApi class HistoryFragment : BaseEpisodesFragment() {
private var sortOrder : SortOrder = SortOrder.PLAYED_DATE_NEW_OLD
private var sortOrder : EpisodeSortOrder = EpisodeSortOrder.PLAYED_DATE_NEW_OLD
private var startDate : Long = 0L
private var endDate : Long = Date().time
@ -190,17 +190,17 @@ import kotlin.math.min
}
class HistorySortDialog : EpisodeSortDialog() {
override fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.PLAYED_DATE_OLD_NEW
|| ascending == SortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == SortOrder.DURATION_SHORT_LONG || ascending == SortOrder.EPISODE_TITLE_A_Z
|| ascending == SortOrder.SIZE_SMALL_LARGE || ascending == SortOrder.FEED_TITLE_A_Z) {
override fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (ascending == EpisodeSortOrder.DATE_OLD_NEW || ascending == EpisodeSortOrder.PLAYED_DATE_OLD_NEW
|| ascending == EpisodeSortOrder.COMPLETED_DATE_OLD_NEW
|| ascending == EpisodeSortOrder.DURATION_SHORT_LONG || ascending == EpisodeSortOrder.EPISODE_TITLE_A_Z
|| ascending == EpisodeSortOrder.SIZE_SMALL_LARGE || ascending == EpisodeSortOrder.FEED_TITLE_A_Z) {
super.onAddItem(title, ascending, descending, ascendingIsDefault)
}
}
override fun onSelectionChanged() {
super.onSelectionChanged()
EventFlow.postEvent(FlowEvent.HistoryEvent(sortOrder?: SortOrder.PLAYED_DATE_NEW_OLD))
EventFlow.postEvent(FlowEvent.HistoryEvent(sortOrder?: EpisodeSortOrder.PLAYED_DATE_NEW_OLD))
}
}
@ -219,7 +219,7 @@ import kotlin.math.min
* @return The playback history. The FeedItems are sorted by their media's playbackCompletionDate in descending order.
*/
fun getHistory(offset: Int, limit: Int, start: Long = 0L, end: Long = Date().time,
sortOrder: SortOrder = SortOrder.PLAYED_DATE_NEW_OLD): List<Episode> {
sortOrder: EpisodeSortOrder = EpisodeSortOrder.PLAYED_DATE_NEW_OLD): List<Episode> {
Logd(TAG, "getHistory() called")
val medias = realm.query(EpisodeMedia::class).query("lastPlayedTime > $0 AND lastPlayedTime <= $1", start, end).find()
var episodes: MutableList<Episode> = mutableListOf()

View File

@ -19,7 +19,7 @@ import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.utils.EpisodeUtil
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.actions.EpisodeMultiSelectHandler
import ac.mdiq.podcini.ui.actions.menuhandler.EpisodeMenuHandler
import ac.mdiq.podcini.ui.actions.menuhandler.MenuItemUtils
@ -572,14 +572,14 @@ import java.util.*
binding.keepSortedCheckbox.setEnabled(UserPreferences.isQueueKeepSorted)
return view
}
override fun onAddItem(title: Int, ascending: SortOrder, descending: SortOrder, ascendingIsDefault: Boolean) {
if (ascending != SortOrder.EPISODE_FILENAME_A_Z && ascending != SortOrder.SIZE_SMALL_LARGE)
override fun onAddItem(title: Int, ascending: EpisodeSortOrder, descending: EpisodeSortOrder, ascendingIsDefault: Boolean) {
if (ascending != EpisodeSortOrder.EPISODE_FILENAME_A_Z && ascending != EpisodeSortOrder.SIZE_SMALL_LARGE)
super.onAddItem(title, ascending, descending, ascendingIsDefault)
}
@UnstableApi override fun onSelectionChanged() {
super.onSelectionChanged()
binding.keepSortedCheckbox.setEnabled(sortOrder != SortOrder.RANDOM)
if (sortOrder == SortOrder.RANDOM) binding.keepSortedCheckbox.setChecked(false)
binding.keepSortedCheckbox.setEnabled(sortOrder != EpisodeSortOrder.RANDOM)
if (sortOrder == EpisodeSortOrder.RANDOM) binding.keepSortedCheckbox.setChecked(false)
UserPreferences.isQueueKeepSorted = binding.keepSortedCheckbox.isChecked
UserPreferences.queueKeepSortedOrder = sortOrder
reorderQueue(sortOrder, true)
@ -590,7 +590,7 @@ import java.util.*
* QueueUpdateBroadcast. This option should be set to `false`
* if the caller wants to avoid unexpected updates of the GUI.
*/
private fun reorderQueue(sortOrder: SortOrder?, broadcastUpdate: Boolean) : Job {
private fun reorderQueue(sortOrder: EpisodeSortOrder?, broadcastUpdate: Boolean) : Job {
Logd(TAG, "reorderQueue called")
if (sortOrder == null) {
Logd(TAG, "reorderQueue() - sortOrder is null. Do nothing.")
@ -664,11 +664,11 @@ import java.util.*
@UnstableApi
override fun afterBindViewHolder(holder: EpisodeViewHolder, pos: Int) {
if (inActionMode() || !dragDropEnabled) {
holder.dragHandle.setVisibility(View.GONE)
holder.dragHandle.visibility = View.GONE
holder.dragHandle.setOnTouchListener(null)
// holder.coverHolder.setOnTouchListener(null)
} else {
holder.dragHandle.setVisibility(View.VISIBLE)
holder.dragHandle.visibility = View.VISIBLE
holder.dragHandle.setOnTouchListener { _: View?, event: MotionEvent ->
if (event.actionMasked == MotionEvent.ACTION_DOWN) swipeActions.startDrag(holder)
false

View File

@ -4,7 +4,8 @@ import ac.mdiq.podcini.R
import ac.mdiq.podcini.databinding.*
import ac.mdiq.podcini.net.feed.FeedUpdateManager
import ac.mdiq.podcini.preferences.UserPreferences
import ac.mdiq.podcini.preferences.UserPreferences.feedOrder
import ac.mdiq.podcini.preferences.UserPreferences.feedOrderBy
import ac.mdiq.podcini.preferences.UserPreferences.feedOrderDir
import ac.mdiq.podcini.preferences.UserPreferences.useGridLayout
import ac.mdiq.podcini.storage.database.Feeds.getFeedList
import ac.mdiq.podcini.storage.database.Feeds.getTags
@ -17,7 +18,7 @@ import ac.mdiq.podcini.ui.actions.menuhandler.FeedMenuHandler
import ac.mdiq.podcini.ui.actions.menuhandler.MenuItemUtils
import ac.mdiq.podcini.ui.activity.MainActivity
import ac.mdiq.podcini.ui.adapter.SelectableAdapter
import ac.mdiq.podcini.ui.dialog.FeedSortDialog
import ac.mdiq.podcini.ui.dialog.FeedSortDialogNew
import ac.mdiq.podcini.ui.dialog.RemoveFeedDialog
import ac.mdiq.podcini.ui.dialog.TagSettingsDialog
import ac.mdiq.podcini.ui.utils.CoverLoader
@ -288,7 +289,7 @@ class SubscriptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener, Selec
val itemId = item.itemId
when (itemId) {
R.id.action_search -> (activity as MainActivity).loadChildFragment(SearchFragment.newInstance())
R.id.subscriptions_sort -> FeedSortDialog.showDialog(requireContext())
R.id.subscriptions_sort -> FeedSortDialogNew().show(childFragmentManager, "FeedSortDialog")
R.id.refresh_item -> FeedUpdateManager.runOnceOrAsk(requireContext())
else -> return false
}
@ -332,28 +333,29 @@ class SubscriptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener, Selec
private fun sortFeeds() {
Logd(TAG, "sortFeeds() called")
val feedOrder = feedOrder
val feedOrder = feedOrderBy
val dir = 1 - 2*feedOrderDir // get from 0, 1 to 1, -1
val comparator: Comparator<Feed> = when (feedOrder) {
UserPreferences.FEED_ORDER_UNPLAYED -> {
val episodes = realm.query(Episode::class).query("(playState == ${Episode.NEW} OR playState == ${Episode.UNPLAYED})").find()
val counterMap = counterMap(episodes)
comparator(counterMap)
comparator(counterMap, dir)
}
UserPreferences.FEED_ORDER_ALPHABETICAL -> {
Comparator { lhs: Feed, rhs: Feed ->
val t1 = lhs.title
val t2 = rhs.title
when {
t1 == null -> 1
t2 == null -> -1
else -> t1.compareTo(t2, ignoreCase = true)
t1 == null -> dir
t2 == null -> -dir
else -> t1.compareTo(t2, ignoreCase = true) * dir
}
}
}
UserPreferences.FEED_ORDER_MOST_PLAYED -> {
val episodes = realm.query(Episode::class).query("playState == ${Episode.PLAYED}").find()
val counterMap = counterMap(episodes)
comparator(counterMap)
comparator(counterMap, dir)
}
UserPreferences.FEED_ORDER_LAST_UPDATED -> {
val episodes = realm.query(Episode::class).sort("pubDate", Sort.DESCENDING).find()
@ -363,7 +365,7 @@ class SubscriptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener, Selec
val pDateOld = counterMap[feedId] ?: 0
if (pDateOld < episode.pubDate) counterMap[feedId] = episode.pubDate
}
comparator(counterMap)
comparator(counterMap, dir)
}
UserPreferences.FEED_ORDER_LAST_UNREAD_UPDATED -> {
val episodes = realm.query(Episode::class)
@ -374,24 +376,24 @@ class SubscriptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener, Selec
val pDateOld = counterMap[feedId] ?: 0
if (pDateOld < episode.pubDate) counterMap[feedId] = episode.pubDate
}
comparator(counterMap)
comparator(counterMap, dir)
}
UserPreferences.FEED_ORDER_DOWNLOADED -> {
val episodes = realm.query(Episode::class).query("media.downloaded == true").find()
val counterMap = counterMap(episodes)
comparator(counterMap)
comparator(counterMap, dir)
}
UserPreferences.FEED_ORDER_DOWNLOADED_UNPLAYED -> {
val episodes = realm.query(Episode::class)
.query("(playState == ${Episode.NEW} OR playState == ${Episode.UNPLAYED}) AND media.downloaded == true").find()
val counterMap = counterMap(episodes)
comparator(counterMap)
comparator(counterMap, dir)
}
// doing FEED_ORDER_NEW
else -> {
val episodes = realm.query(Episode::class).query("playState == ${Episode.NEW}").find()
val counterMap = counterMap(episodes)
comparator(counterMap)
comparator(counterMap, dir)
}
}
synchronized(feedList) { feedList.sortWith(comparator) }
@ -407,15 +409,15 @@ class SubscriptionsFragment : Fragment(), Toolbar.OnMenuItemClickListener, Selec
return counterMap
}
private fun comparator(counterMap: Map<Long, Long>): Comparator<Feed> {
private fun comparator(counterMap: Map<Long, Long>, dir: Int): Comparator<Feed> {
return Comparator { lhs: Feed, rhs: Feed ->
val counterLhs = counterMap[lhs.id]?:0
val counterRhs = counterMap[rhs.id]?:0
when {
// reverse natural order: podcast with most unplayed episodes first
counterLhs > counterRhs -> -1
counterLhs == counterRhs -> lhs.title?.compareTo(rhs.title!!, ignoreCase = true) ?: -1
else -> 1
counterLhs > counterRhs -> -dir
counterLhs == counterRhs -> (lhs.title?.compareTo(rhs.title!!, ignoreCase = true) ?: -1) * dir
else -> dir
}
}
}

View File

@ -18,10 +18,12 @@ import ac.mdiq.podcini.ui.actions.actionbutton.TTSActionButton
import ac.mdiq.podcini.ui.activity.MainActivity
import ac.mdiq.podcini.ui.utils.CoverLoader
import ac.mdiq.podcini.ui.utils.ThemeUtils
import ac.mdiq.podcini.ui.utils.ThemeUtils.getColorFromAttr
import ac.mdiq.podcini.ui.view.CircularProgressBar
import ac.mdiq.podcini.util.Converter
import ac.mdiq.podcini.util.DateFormatter
import ac.mdiq.podcini.util.Logd
import android.graphics.PorterDuff
import android.text.Layout
import android.text.format.Formatter
import android.util.Log
@ -34,6 +36,7 @@ import android.widget.ProgressBar
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.cardview.widget.CardView
import androidx.core.content.ContextCompat
import androidx.media3.common.util.UnstableApi
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.elevation.SurfaceColors
@ -93,21 +96,25 @@ open class EpisodeViewHolder(private val activity: MainActivity, parent: ViewGro
this.episode = item
placeholder.text = item.feed?.title
title.text = item.title
container.alpha = if (item.isPlayed()) 0.75f else 1.0f
if (item.isPlayed()) {
leftPadding.contentDescription = item.title + ". " + activity.getString(R.string.is_played)
binding.playedMark.visibility = View.VISIBLE
binding.playedMark.alpha = 1.0f
} else {
leftPadding.contentDescription = item.title
binding.playedMark.visibility = View.GONE
container.alpha = if (item.isPlayed()) 0.7f else 1.0f
leftPadding.contentDescription = item.title
binding.playedMark.visibility = View.GONE
when {
item.isPlayed() -> {
leftPadding.contentDescription = item.title + ". " + activity.getString(R.string.is_played)
binding.playedMark.visibility = View.VISIBLE
binding.playedMark.alpha = 1.0f
}
item.isNew -> {
binding.txtvPubDate.setTextColor(getColorFromAttr(activity, androidx.appcompat.R.attr.colorAccent))
}
}
setPubDate(item)
isFavorite.visibility = if (item.isFavorite) View.VISIBLE else View.GONE
isInQueue.visibility = if (curQueue.isInQueue(item)) View.VISIBLE else View.GONE
container.alpha = if (item.isPlayed()) 0.75f else 1.0f
// container.alpha = if (item.isPlayed()) 0.7f else 1.0f
val newButton = EpisodeActionButton.forItem(item)
// Logd(TAG, "Trying to bind button ${actionButton?.TAG} ${newButton.TAG} ${item.title}")
@ -152,6 +159,7 @@ open class EpisodeViewHolder(private val activity: MainActivity, parent: ViewGro
Logd(TAG, "setting cover to ic_launcher")
cover.setImageDrawable(AppCompatResources.getDrawable(activity, R.drawable.ic_launcher_foreground))
}
// if (item.isNew) cover.setColorFilter(ContextCompat.getColor(activity, R.color.gradient_100), PorterDuff.Mode.MULTIPLY)
}
}

View File

@ -5,7 +5,7 @@ import ac.mdiq.podcini.net.download.DownloadStatus
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.Playable
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.util.Logd
import android.content.Context
import android.view.KeyEvent
@ -93,7 +93,7 @@ sealed class FlowEvent {
}
}
data class HistoryEvent(val sortOrder: SortOrder = SortOrder.PLAYED_DATE_NEW_OLD, val startDate: Long = 0, val endDate: Long = Date().time) : FlowEvent()
data class HistoryEvent(val sortOrder: EpisodeSortOrder = EpisodeSortOrder.PLAYED_DATE_NEW_OLD, val startDate: Long = 0, val endDate: Long = Date().time) : FlowEvent()
data class SleepTimerUpdatedEvent(private val timeLeft: Long) : FlowEvent() {
val isOver: Boolean

View File

@ -1,7 +1,7 @@
package ac.mdiq.podcini.util.sorting
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import java.util.*
/**
@ -14,43 +14,43 @@ object EpisodesPermutors {
* @return Permutor that sorts a list appropriate to the given sort order.
*/
@JvmStatic
fun getPermutor(sortOrder: SortOrder): Permutor<Episode> {
fun getPermutor(sortOrder: EpisodeSortOrder): Permutor<Episode> {
var comparator: Comparator<Episode>? = null
var permutor: Permutor<Episode>? = null
when (sortOrder) {
SortOrder.EPISODE_TITLE_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemTitle(f1).compareTo(itemTitle(f2)) }
SortOrder.EPISODE_TITLE_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemTitle(f2).compareTo(itemTitle(f1)) }
SortOrder.DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> pubDate(f1).compareTo(pubDate(f2)) }
SortOrder.DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> pubDate(f2).compareTo(pubDate(f1)) }
SortOrder.DURATION_SHORT_LONG -> comparator = Comparator { f1: Episode?, f2: Episode? -> duration(f1).compareTo(duration(f2)) }
SortOrder.DURATION_LONG_SHORT -> comparator = Comparator { f1: Episode?, f2: Episode? -> duration(f2).compareTo(duration(f1)) }
SortOrder.EPISODE_FILENAME_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemLink(f1).compareTo(itemLink(f2)) }
SortOrder.EPISODE_FILENAME_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemLink(f2).compareTo(itemLink(f1)) }
SortOrder.PLAYED_DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> playDate(f1).compareTo(playDate(f2)) }
SortOrder.PLAYED_DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> playDate(f2).compareTo(playDate(f1)) }
SortOrder.COMPLETED_DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> completeDate(f1).compareTo(completeDate(f2)) }
SortOrder.COMPLETED_DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> completeDate(f2).compareTo(completeDate(f1)) }
EpisodeSortOrder.EPISODE_TITLE_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemTitle(f1).compareTo(itemTitle(f2)) }
EpisodeSortOrder.EPISODE_TITLE_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemTitle(f2).compareTo(itemTitle(f1)) }
EpisodeSortOrder.DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> pubDate(f1).compareTo(pubDate(f2)) }
EpisodeSortOrder.DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> pubDate(f2).compareTo(pubDate(f1)) }
EpisodeSortOrder.DURATION_SHORT_LONG -> comparator = Comparator { f1: Episode?, f2: Episode? -> duration(f1).compareTo(duration(f2)) }
EpisodeSortOrder.DURATION_LONG_SHORT -> comparator = Comparator { f1: Episode?, f2: Episode? -> duration(f2).compareTo(duration(f1)) }
EpisodeSortOrder.EPISODE_FILENAME_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemLink(f1).compareTo(itemLink(f2)) }
EpisodeSortOrder.EPISODE_FILENAME_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> itemLink(f2).compareTo(itemLink(f1)) }
EpisodeSortOrder.PLAYED_DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> playDate(f1).compareTo(playDate(f2)) }
EpisodeSortOrder.PLAYED_DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> playDate(f2).compareTo(playDate(f1)) }
EpisodeSortOrder.COMPLETED_DATE_OLD_NEW -> comparator = Comparator { f1: Episode?, f2: Episode? -> completeDate(f1).compareTo(completeDate(f2)) }
EpisodeSortOrder.COMPLETED_DATE_NEW_OLD -> comparator = Comparator { f1: Episode?, f2: Episode? -> completeDate(f2).compareTo(completeDate(f1)) }
SortOrder.FEED_TITLE_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> feedTitle(f1).compareTo(feedTitle(f2)) }
SortOrder.FEED_TITLE_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> feedTitle(f2).compareTo(feedTitle(f1)) }
SortOrder.RANDOM -> permutor = object : Permutor<Episode> {
EpisodeSortOrder.FEED_TITLE_A_Z -> comparator = Comparator { f1: Episode?, f2: Episode? -> feedTitle(f1).compareTo(feedTitle(f2)) }
EpisodeSortOrder.FEED_TITLE_Z_A -> comparator = Comparator { f1: Episode?, f2: Episode? -> feedTitle(f2).compareTo(feedTitle(f1)) }
EpisodeSortOrder.RANDOM -> permutor = object : Permutor<Episode> {
override fun reorder(queue: MutableList<Episode>?) {
if (!queue.isNullOrEmpty()) queue.shuffle()
}
}
SortOrder.SMART_SHUFFLE_OLD_NEW -> permutor = object : Permutor<Episode> {
EpisodeSortOrder.SMART_SHUFFLE_OLD_NEW -> permutor = object : Permutor<Episode> {
override fun reorder(queue: MutableList<Episode>?) {
if (!queue.isNullOrEmpty()) smartShuffle(queue as MutableList<Episode?>, true)
}
}
SortOrder.SMART_SHUFFLE_NEW_OLD -> permutor = object : Permutor<Episode> {
EpisodeSortOrder.SMART_SHUFFLE_NEW_OLD -> permutor = object : Permutor<Episode> {
override fun reorder(queue: MutableList<Episode>?) {
if (!queue.isNullOrEmpty()) smartShuffle(queue as MutableList<Episode?>, false)
}
}
SortOrder.SIZE_SMALL_LARGE -> comparator = Comparator { f1: Episode?, f2: Episode? -> size(f1).compareTo(size(f2)) }
SortOrder.SIZE_LARGE_SMALL -> comparator = Comparator { f1: Episode?, f2: Episode? -> size(f2).compareTo(size(f1)) }
EpisodeSortOrder.SIZE_SMALL_LARGE -> comparator = Comparator { f1: Episode?, f2: Episode? -> size(f1).compareTo(size(f2)) }
EpisodeSortOrder.SIZE_LARGE_SMALL -> comparator = Comparator { f1: Episode?, f2: Episode? -> size(f2).compareTo(size(f1)) }
}
if (comparator != null) {
val comparator2: Comparator<Episode> = comparator

View File

@ -60,15 +60,13 @@
<string name="drawer_open">افتح القائمة</string>
<string name="drawer_close">اغلق القائمة</string>
<string name="drawer_preferences">تفضيلات الدرج</string>
<string name="drawer_feed_order_unplayed_episodes">رتب بعدد الحلقات</string>
<string name="drawer_feed_order_alphabetical">رتب أبجديا</string>
<string name="drawer_feed_order_last_update">رتب بتاريخ النشر</string>
<string name="drawer_feed_order_most_played">رتب بعدد الحلقات المشغلة</string>
<string name="feed_order_alphabetical">رتب أبجديا</string>
<string name="feed_order_last_update">رتب بتاريخ النشر</string>
<string name="feed_order_most_played">رتب بعدد الحلقات المشغلة</string>
<string name="drawer_feed_order_unplayed">عدد الحلقات غير المشغلة</string>
<string name="drawer_feed_counter_downloaded">عدد الحلقات المنزلة</string>
<string name="drawer_feed_counter_downloaded_unplayed">عدد الحلقات المنزلة وغير المشغلة</string>
<string name="drawer_feed_counter_none">بدون</string>
<string name="feed_order_unplayed_count">عدد الحلقات غير المشغلة</string>
<string name="feed_counter_downloaded">عدد الحلقات المنزلة</string>
<string name="feed_counter_downloaded_unplayed">عدد الحلقات المنزلة وغير المشغلة</string>
<!--Bug report activity-->
<string name="log_file_share_exception">لا يوجد برنامج متوافق</string>
<string name="export_logs_menu_title">اصدار سجلات مفصلة</string>

View File

@ -24,13 +24,11 @@
<!--Main activity-->
<string name="drawer_open">Abrir el menú</string>
<string name="drawer_close">Zarrar el menú</string>
<string name="drawer_feed_order_unplayed_episodes">Pol contador</string>
<string name="drawer_feed_order_alphabetical">Alfabéticamente</string>
<string name="drawer_feed_order_last_update">Pola data d\'espublizamientu</string>
<string name="drawer_feed_order_most_played">Pol númberu d\'episodios reproducíos</string>
<string name="drawer_feed_order_unplayed">Episodios ensin reproducir</string>
<string name="drawer_feed_counter_downloaded">Episodios baxaos</string>
<string name="drawer_feed_counter_none">Nada</string>
<string name="feed_order_alphabetical">Alfabéticamente</string>
<string name="feed_order_last_update">Pola data d\'espublizamientu</string>
<string name="feed_order_most_played">Pol númberu d\'episodios reproducíos</string>
<string name="feed_order_unplayed_count">Episodios ensin reproducir</string>
<string name="feed_counter_downloaded">Episodios baxaos</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nun s\'atoparon aplicaciones compatibles</string>
<string name="export_logs_menu_title">Esportar el rexistru detalláu</string>

View File

@ -55,15 +55,13 @@
<string name="drawer_open">Digeriñ al lañser</string>
<string name="drawer_close">Serriñ al lañser</string>
<string name="drawer_preferences">Gwellvezioù ar stalaf</string>
<string name="drawer_feed_order_unplayed_episodes">Rummañ dre gonter</string>
<string name="drawer_feed_order_alphabetical">Rummañ dre urzh al lizherenneg</string>
<string name="drawer_feed_order_last_update">Rummañ dre an deiziad embann</string>
<string name="drawer_feed_order_most_played">Rummañ dre an niver a rannoù lennet</string>
<string name="feed_order_alphabetical">Rummañ dre urzh al lizherenneg</string>
<string name="feed_order_last_update">Rummañ dre an deiziad embann</string>
<string name="feed_order_most_played">Rummañ dre an niver a rannoù lennet</string>
<string name="drawer_feed_order_unplayed">Niver a rannoù n\'int ket bet lennet</string>
<string name="drawer_feed_counter_downloaded">Niver a rannoù pellgarget</string>
<string name="drawer_feed_counter_downloaded_unplayed">Niver a rannoù pellgarget n\'int ket bet lennet</string>
<string name="drawer_feed_counter_none">Hini ebet</string>
<string name="feed_order_unplayed_count">Niver a rannoù n\'int ket bet lennet</string>
<string name="feed_counter_downloaded">Niver a rannoù pellgarget</string>
<string name="feed_counter_downloaded_unplayed">Niver a rannoù pellgarget n\'int ket bet lennet</string>
<!--Bug report activity-->
<string name="log_file_share_exception">N\'eo ket bet kavet arloadoù keverlec\'h</string>
<string name="export_logs_menu_title">Ezporzhiañ ar c\'herzhlevrioù dre ar munud</string>

View File

@ -56,15 +56,13 @@
<string name="drawer_open">Obre menú</string>
<string name="drawer_close">Tanca menú</string>
<string name="drawer_preferences">Preferències</string>
<string name="drawer_feed_order_unplayed_episodes">Ordre per comptador</string>
<string name="drawer_feed_order_alphabetical">Ordre alfabètic</string>
<string name="drawer_feed_order_last_update">Ordre per data de publicació</string>
<string name="drawer_feed_order_most_played">Ordre per número d\'episodis reproduïts</string>
<string name="feed_order_alphabetical">Ordre alfabètic</string>
<string name="feed_order_last_update">Ordre per data de publicació</string>
<string name="feed_order_most_played">Ordre per número d\'episodis reproduïts</string>
<string name="drawer_feed_order_unplayed">Número d\'episodis per reproduir</string>
<string name="drawer_feed_counter_downloaded">Número d\'episodis descarregats</string>
<string name="drawer_feed_counter_downloaded_unplayed">Número de descàrregues i episodis sense reproduir</string>
<string name="drawer_feed_counter_none">Cap</string>
<string name="feed_order_unplayed_count">Número d\'episodis per reproduir</string>
<string name="feed_counter_downloaded">Número d\'episodis descarregats</string>
<string name="feed_counter_downloaded_unplayed">Número de descàrregues i episodis sense reproduir</string>
<!--Bug report activity-->
<string name="log_file_share_exception">No s\'han trobat aplicacions compatibles</string>
<string name="export_logs_menu_title">Exporta registres detallats</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Otevřít menu</string>
<string name="drawer_close">Zavřít menu</string>
<string name="drawer_preferences">Nastavení postranního panelu</string>
<string name="drawer_feed_order_unplayed_episodes">Řadit dle čítače</string>
<string name="drawer_feed_order_alphabetical">Řadit abecedně</string>
<string name="drawer_feed_order_last_update">Řadit dle data zveřejnění</string>
<string name="drawer_feed_order_most_played">Řadit podle počtu poslechnutých epizod</string>
<string name="feed_order_alphabetical">Řadit abecedně</string>
<string name="feed_order_last_update">Řadit dle data zveřejnění</string>
<string name="feed_order_most_played">Řadit podle počtu poslechnutých epizod</string>
<string name="drawer_feed_order_unplayed">Počet nepřehraných epizod</string>
<string name="drawer_feed_counter_downloaded">Počet stažených epizod</string>
<string name="drawer_feed_counter_downloaded_unplayed">Počet stažených a nepřehraných epizod</string>
<string name="drawer_feed_counter_none">Žádné</string>
<string name="feed_order_unplayed_count">Počet nepřehraných epizod</string>
<string name="feed_counter_downloaded">Počet stažených epizod</string>
<string name="feed_counter_downloaded_unplayed">Počet stažených a nepřehraných epizod</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nenalezena kompatibilní aplikace</string>
<string name="export_logs_menu_title">Exportovat detailní záznamy</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Åbn menu</string>
<string name="drawer_close">Luk menu</string>
<string name="drawer_preferences">Præferencer for panel</string>
<string name="drawer_feed_order_unplayed_episodes">Sorter efter tæller</string>
<string name="drawer_feed_order_alphabetical">Sorter alfabetisk</string>
<string name="drawer_feed_order_last_update">Sorter efter udgivelsesdato</string>
<string name="drawer_feed_order_most_played">Sorter efter antal afspillede afsnit</string>
<string name="feed_order_alphabetical">Sorter alfabetisk</string>
<string name="feed_order_last_update">Sorter efter udgivelsesdato</string>
<string name="feed_order_most_played">Sorter efter antal afspillede afsnit</string>
<string name="drawer_feed_order_unplayed">Antal uafspillede afsnit</string>
<string name="drawer_feed_counter_downloaded">Antal overførte afsnit</string>
<string name="drawer_feed_counter_downloaded_unplayed">Antal overførte og uafspillede afsnit</string>
<string name="drawer_feed_counter_none">Ingen</string>
<string name="feed_order_unplayed_count">Antal uafspillede afsnit</string>
<string name="feed_counter_downloaded">Antal overførte afsnit</string>
<string name="feed_counter_downloaded_unplayed">Antal overførte og uafspillede afsnit</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Ingen kompatible apper fundet.</string>
<string name="export_logs_menu_title">Eksporter detaljeret log</string>

View File

@ -61,15 +61,13 @@
<string name="drawer_open">Menü öffnen</string>
<string name="drawer_close">Menü schließen</string>
<string name="drawer_preferences">Seitenleisten-Einstellungen</string>
<string name="drawer_feed_order_unplayed_episodes">Nach Zähler sortieren </string>
<string name="drawer_feed_order_alphabetical">Alphabetisch sortieren</string>
<string name="drawer_feed_order_last_update">Nach Veröffentlichungsdatum sortieren</string>
<string name="drawer_feed_order_most_played">Nach Anzahl gespielter Episoden sortieren</string>
<string name="feed_order_alphabetical">Alphabetisch sortieren</string>
<string name="feed_order_last_update">Nach Veröffentlichungsdatum sortieren</string>
<string name="feed_order_most_played">Nach Anzahl gespielter Episoden sortieren</string>
<string name="drawer_feed_order_unplayed">Anzahl nicht abgespielter Episoden</string>
<string name="drawer_feed_counter_downloaded">Anzahl heruntergeladener Episoden</string>
<string name="drawer_feed_counter_downloaded_unplayed">Anzahl heruntergeladener und nicht abgespielter Episoden</string>
<string name="drawer_feed_counter_none">Keine</string>
<string name="feed_order_unplayed_count">Anzahl nicht abgespielter Episoden</string>
<string name="feed_counter_downloaded">Anzahl heruntergeladener Episoden</string>
<string name="feed_counter_downloaded_unplayed">Anzahl heruntergeladener und nicht abgespielter Episoden</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Keine kompatiblen Apps gefunden</string>
<string name="export_logs_menu_title">Detaillierte Logs exportieren</string>

View File

@ -60,15 +60,13 @@
<string name="drawer_open">Abrir menú</string>
<string name="drawer_close">Cerrar menú</string>
<string name="drawer_preferences">Preferencias del cajón</string>
<string name="drawer_feed_order_unplayed_episodes">Ordenar por contador</string>
<string name="drawer_feed_order_alphabetical">Ordenar alfabéticamente</string>
<string name="drawer_feed_order_last_update">Ordenar por fecha de publicación</string>
<string name="drawer_feed_order_most_played">Ordenar por número de episodios reproducidos</string>
<string name="feed_order_alphabetical">Ordenar alfabéticamente</string>
<string name="feed_order_last_update">Ordenar por fecha de publicación</string>
<string name="feed_order_most_played">Ordenar por número de episodios reproducidos</string>
<string name="drawer_feed_order_unplayed">Número de episodios no reproducidos</string>
<string name="drawer_feed_counter_downloaded">Número de episodios descargados</string>
<string name="drawer_feed_counter_downloaded_unplayed">Número de episodios descargados y no reproducidos</string>
<string name="drawer_feed_counter_none">Ninguno</string>
<string name="feed_order_unplayed_count">Número de episodios no reproducidos</string>
<string name="feed_counter_downloaded">Número de episodios descargados</string>
<string name="feed_counter_downloaded_unplayed">Número de episodios descargados y no reproducidos</string>
<!--Bug report activity-->
<string name="log_file_share_exception">No se encontró ninguna aplicación compatible</string>
<string name="export_logs_menu_title">Exportar registros detallados</string>

View File

@ -48,14 +48,12 @@
<!--Main activity-->
<string name="drawer_open">Ava menüü</string>
<string name="drawer_close">Sulge menüü</string>
<string name="drawer_feed_order_unplayed_episodes">Sorteeri arvu järgi</string>
<string name="drawer_feed_order_alphabetical">Sorteeri tähestiku järgi</string>
<string name="drawer_feed_order_last_update">Sorteeri avaldamise kuupäeva järgi</string>
<string name="drawer_feed_order_most_played">Sorteeri kuulatud saadete järgi</string>
<string name="drawer_feed_order_unplayed">Kuulamata saadete arv</string>
<string name="drawer_feed_counter_downloaded">Allalaaditud saadete arv</string>
<string name="drawer_feed_counter_downloaded_unplayed">Allalaaditud kuulamata saadete arv</string>
<string name="drawer_feed_counter_none">Pole</string>
<string name="feed_order_alphabetical">Sorteeri tähestiku järgi</string>
<string name="feed_order_last_update">Sorteeri avaldamise kuupäeva järgi</string>
<string name="feed_order_most_played">Sorteeri kuulatud saadete järgi</string>
<string name="feed_order_unplayed_count">Kuulamata saadete arv</string>
<string name="feed_counter_downloaded">Allalaaditud saadete arv</string>
<string name="feed_counter_downloaded_unplayed">Allalaaditud kuulamata saadete arv</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Ühtegi ühilduvat rakendust ei leitud</string>
<string name="export_logs_menu_title">Ekspordi täpne logi</string>

View File

@ -55,14 +55,12 @@
<!--Main activity-->
<string name="drawer_open">Ireki menua</string>
<string name="drawer_close">Itxi menua</string>
<string name="drawer_feed_order_unplayed_episodes">Antolatu kontagailuaren arabera</string>
<string name="drawer_feed_order_alphabetical">Antolatu alfabetikoki</string>
<string name="drawer_feed_order_last_update">Antolatu argitaratze dataz</string>
<string name="drawer_feed_order_most_played">Antolatu ikusitako saioen arabera</string>
<string name="feed_order_alphabetical">Antolatu alfabetikoki</string>
<string name="feed_order_last_update">Antolatu argitaratze dataz</string>
<string name="feed_order_most_played">Antolatu ikusitako saioen arabera</string>
<string name="drawer_feed_order_unplayed">Entzun gabeko saioen zenbatekoa</string>
<string name="drawer_feed_counter_downloaded">Deskargatutako saio kopurua</string>
<string name="drawer_feed_counter_none">Bat ere ez</string>
<string name="feed_order_unplayed_count">Entzun gabeko saioen zenbatekoa</string>
<string name="feed_counter_downloaded">Deskargatutako saio kopurua</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Ez dago app bateragarririk</string>
<string name="export_logs_menu_title">Esportatu log zehatzak</string>

View File

@ -62,15 +62,13 @@
<string name="drawer_open">باز کردن منو</string>
<string name="drawer_close">بستن منو</string>
<string name="drawer_preferences">ترجیحات کشو</string>
<string name="drawer_feed_order_unplayed_episodes">مرتب‌سازی بر اساس شمارنده</string>
<string name="drawer_feed_order_alphabetical">مرتب‌سازی بر اساس حروف الفبا</string>
<string name="drawer_feed_order_last_update">مرتب‌سازی بر اساس تاریخ انتشار</string>
<string name="drawer_feed_order_most_played">چینش بر اساس تعداد قسمت‌های پخش شده</string>
<string name="feed_order_alphabetical">مرتب‌سازی بر اساس حروف الفبا</string>
<string name="feed_order_last_update">مرتب‌سازی بر اساس تاریخ انتشار</string>
<string name="feed_order_most_played">چینش بر اساس تعداد قسمت‌های پخش شده</string>
<string name="drawer_feed_order_unplayed">تعداد قسمت‌های پخش‌نشده</string>
<string name="drawer_feed_counter_downloaded">تعداد قسمت‌های بار گرفته</string>
<string name="drawer_feed_counter_downloaded_unplayed">تعداد قسمت‌های بار گرفته و پخش نشده</string>
<string name="drawer_feed_counter_none">هیچ‌یک</string>
<string name="feed_order_unplayed_count">تعداد قسمت‌های پخش‌نشده</string>
<string name="feed_counter_downloaded">تعداد قسمت‌های بار گرفته</string>
<string name="feed_counter_downloaded_unplayed">تعداد قسمت‌های بار گرفته و پخش نشده</string>
<!--Bug report activity-->
<string name="log_file_share_exception">هیچ اپ سازگاری پیدا نشد</string>
<string name="export_logs_menu_title">برون‌ریزی گزارش پرجزئیات</string>

View File

@ -55,15 +55,13 @@
<string name="drawer_open">Avaa menu</string>
<string name="drawer_close">Sulje menu</string>
<string name="drawer_preferences">Hyllyasetukset</string>
<string name="drawer_feed_order_unplayed_episodes">Järjestä kertojen mukaan</string>
<string name="drawer_feed_order_alphabetical">Järjestä aakkosellisesti</string>
<string name="drawer_feed_order_last_update">Järjestä julkaisupäivän mukaan</string>
<string name="drawer_feed_order_most_played">Järjestä toistettujen jaksojen mukaan</string>
<string name="feed_order_alphabetical">Järjestä aakkosellisesti</string>
<string name="feed_order_last_update">Järjestä julkaisupäivän mukaan</string>
<string name="feed_order_most_played">Järjestä toistettujen jaksojen mukaan</string>
<string name="drawer_feed_order_unplayed">Toistamattomia jaksoja</string>
<string name="drawer_feed_counter_downloaded">Ladattuja jaksoja</string>
<string name="drawer_feed_counter_downloaded_unplayed">Ladattuja ja toistamattomia jaksoja</string>
<string name="drawer_feed_counter_none">Ei yhtään</string>
<string name="feed_order_unplayed_count">Toistamattomia jaksoja</string>
<string name="feed_counter_downloaded">Ladattuja jaksoja</string>
<string name="feed_counter_downloaded_unplayed">Ladattuja ja toistamattomia jaksoja</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Yhteensopivia sovelluksia ei löytynyt</string>
<string name="export_logs_menu_title">Vie yksityiskohtaiset lokit</string>

View File

@ -61,15 +61,13 @@
<string name="drawer_open">Ouvrir le menu</string>
<string name="drawer_close">Fermer le menu</string>
<string name="drawer_preferences">Préférences du volet</string>
<string name="drawer_feed_order_unplayed_episodes">Trier par compteur</string>
<string name="drawer_feed_order_alphabetical">Trier par ordre alphabétique</string>
<string name="drawer_feed_order_last_update">Trier par date de publication</string>
<string name="drawer_feed_order_most_played">Trier par nombre lus</string>
<string name="feed_order_alphabetical">Trier par ordre alphabétique</string>
<string name="feed_order_last_update">Trier par date de publication</string>
<string name="feed_order_most_played">Trier par nombre lus</string>
<string name="drawer_feed_order_unplayed">Épisodes non lus</string>
<string name="drawer_feed_counter_downloaded">Épisodes téléchargés</string>
<string name="drawer_feed_counter_downloaded_unplayed">Épisodes téléchargés et non lus</string>
<string name="drawer_feed_counter_none">Aucun</string>
<string name="feed_order_unplayed_count">Épisodes non lus</string>
<string name="feed_counter_downloaded">Épisodes téléchargés</string>
<string name="feed_counter_downloaded_unplayed">Épisodes téléchargés et non lus</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Aucune application compatible trouvée</string>
<string name="export_logs_menu_title">Export détaillé des logs</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Abrir menú</string>
<string name="drawer_close">Pechar menú</string>
<string name="drawer_preferences">Preferencias do panel</string>
<string name="drawer_feed_order_unplayed_episodes">Ordenar polo contador</string>
<string name="drawer_feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="drawer_feed_order_last_update">Ordenar por data de publicación</string>
<string name="drawer_feed_order_most_played">Ordenar por número de episodios reproducidos</string>
<string name="feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="feed_order_last_update">Ordenar por data de publicación</string>
<string name="feed_order_most_played">Ordenar por número de episodios reproducidos</string>
<string name="drawer_feed_order_unplayed">Número de episodios non reproducidos</string>
<string name="drawer_feed_counter_downloaded">Número de episodios descargados</string>
<string name="drawer_feed_counter_downloaded_unplayed">Número de episodios descargados e non escoitados</string>
<string name="drawer_feed_counter_none">Ningún</string>
<string name="feed_order_unplayed_count">Número de episodios non reproducidos</string>
<string name="feed_counter_downloaded">Número de episodios descargados</string>
<string name="feed_counter_downloaded_unplayed">Número de episodios descargados e non escoitados</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Non se atopan apps compatibles</string>
<string name="export_logs_menu_title">Exportar rexistro detallado</string>

View File

@ -51,15 +51,13 @@
<!--Main activity-->
<string name="drawer_open">Menü megnyitása</string>
<string name="drawer_close">Menü bezárása</string>
<string name="drawer_feed_order_unplayed_episodes">Rendezés számláló szerint</string>
<string name="drawer_feed_order_alphabetical">Rendezés betűrendben</string>
<string name="drawer_feed_order_last_update">Rendezés közzététel dátuma szerint</string>
<string name="drawer_feed_order_most_played">Rendezés lejátszott epizódok szerint</string>
<string name="feed_order_alphabetical">Rendezés betűrendben</string>
<string name="feed_order_last_update">Rendezés közzététel dátuma szerint</string>
<string name="feed_order_most_played">Rendezés lejátszott epizódok szerint</string>
<string name="drawer_feed_order_unplayed">Nem játszott epizódok száma</string>
<string name="drawer_feed_counter_downloaded">Letöltött epizódok száma</string>
<string name="drawer_feed_counter_downloaded_unplayed">Letöltött és nem lejátszott epizódok száma</string>
<string name="drawer_feed_counter_none">Nincs</string>
<string name="feed_order_unplayed_count">Nem játszott epizódok száma</string>
<string name="feed_counter_downloaded">Letöltött epizódok száma</string>
<string name="feed_counter_downloaded_unplayed">Letöltött és nem lejátszott epizódok száma</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nem található kompatibilis alkalmazás</string>
<string name="export_logs_menu_title">Részletes naplók exportálása</string>

View File

@ -51,15 +51,13 @@
<string name="drawer_open">Buka menu</string>
<string name="drawer_close">Tutup menu</string>
<string name="drawer_preferences">Preferensi laci</string>
<string name="drawer_feed_order_unplayed_episodes">Urutkan berdasarkan penghitung</string>
<string name="drawer_feed_order_alphabetical">Urutkan menurut abjad</string>
<string name="drawer_feed_order_last_update">Urutkan menurut tanggal publikasi</string>
<string name="drawer_feed_order_most_played">Urutkan menurut jumlah episode yang diputar</string>
<string name="feed_order_alphabetical">Urutkan menurut abjad</string>
<string name="feed_order_last_update">Urutkan menurut tanggal publikasi</string>
<string name="feed_order_most_played">Urutkan menurut jumlah episode yang diputar</string>
<string name="drawer_feed_order_unplayed">Jumlah episode yang belum diputar</string>
<string name="drawer_feed_counter_downloaded">Jumlah episode yang diunduh</string>
<string name="drawer_feed_counter_downloaded_unplayed">Jumlah episode yang terunduh dan belum terputar</string>
<string name="drawer_feed_counter_none">Tidak ada</string>
<string name="feed_order_unplayed_count">Jumlah episode yang belum diputar</string>
<string name="feed_counter_downloaded">Jumlah episode yang diunduh</string>
<string name="feed_counter_downloaded_unplayed">Jumlah episode yang terunduh dan belum terputar</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Tidak ada aplikasi kompatibel yang ditemukan</string>
<string name="export_logs_menu_title">Ekspor log rinci</string>

View File

@ -61,15 +61,13 @@
<string name="drawer_open">Apri il menù</string>
<string name="drawer_close">Chiudi il menù</string>
<string name="drawer_preferences">Preferenze del menu</string>
<string name="drawer_feed_order_unplayed_episodes">Ordina per contatore</string>
<string name="drawer_feed_order_alphabetical">Ordina alfabeticamente</string>
<string name="drawer_feed_order_last_update">Ordina per data di pubblicazione</string>
<string name="drawer_feed_order_most_played">Ordina per numero di episodi riprodotti</string>
<string name="feed_order_alphabetical">Ordina alfabeticamente</string>
<string name="feed_order_last_update">Ordina per data di pubblicazione</string>
<string name="feed_order_most_played">Ordina per numero di episodi riprodotti</string>
<string name="drawer_feed_order_unplayed">Numero di episodi non riprodotti</string>
<string name="drawer_feed_counter_downloaded">Numero di episodi scaricati</string>
<string name="drawer_feed_counter_downloaded_unplayed">Numero di episodi scaricati e non riprodotti</string>
<string name="drawer_feed_counter_none">Nessuno</string>
<string name="feed_order_unplayed_count">Numero di episodi non riprodotti</string>
<string name="feed_counter_downloaded">Numero di episodi scaricati</string>
<string name="feed_counter_downloaded_unplayed">Numero di episodi scaricati e non riprodotti</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nessuna applicazione compatibile trovata</string>
<string name="export_logs_menu_title">Esporta registri dettagliati</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">פתיחת תפריט</string>
<string name="drawer_close">סגירת תפריט</string>
<string name="drawer_preferences">העדפות מגירה</string>
<string name="drawer_feed_order_unplayed_episodes">מיון לפי מונה</string>
<string name="drawer_feed_order_alphabetical">מיון בסדר אלפביתי</string>
<string name="drawer_feed_order_last_update">מיון לפי תאריך פרסום</string>
<string name="drawer_feed_order_most_played">מיון לפי מספר פרקים שהושמעו </string>
<string name="feed_order_alphabetical">מיון בסדר אלפביתי</string>
<string name="feed_order_last_update">מיון לפי תאריך פרסום</string>
<string name="feed_order_most_played">מיון לפי מספר פרקים שהושמעו </string>
<string name="drawer_feed_order_unplayed">מספר פרקים שעוד לא התנגנו</string>
<string name="drawer_feed_counter_downloaded">מספר פרקים שהתקבלו</string>
<string name="drawer_feed_counter_downloaded_unplayed">מספר הפרקים שירדו אבל לא נוגנו</string>
<string name="drawer_feed_counter_none">ללא</string>
<string name="feed_order_unplayed_count">מספר פרקים שעוד לא התנגנו</string>
<string name="feed_counter_downloaded">מספר פרקים שהתקבלו</string>
<string name="feed_counter_downloaded_unplayed">מספר הפרקים שירדו אבל לא נוגנו</string>
<!--Bug report activity-->
<string name="log_file_share_exception">לא נמצאו יישומונים תואמים</string>
<string name="export_logs_menu_title">ייצוא יומנים מפורטים</string>

View File

@ -44,15 +44,13 @@
<!--Main activity-->
<string name="drawer_open">メニューを開く</string>
<string name="drawer_close">メニューを閉じる</string>
<string name="drawer_feed_order_unplayed_episodes">カウンターで並べ替え</string>
<string name="drawer_feed_order_alphabetical">アルファベット順で並べ替え</string>
<string name="drawer_feed_order_last_update">公開日で並べ替え</string>
<string name="drawer_feed_order_most_played">再生したエピソードの数で並べ替え</string>
<string name="feed_order_alphabetical">アルファベット順で並べ替え</string>
<string name="feed_order_last_update">公開日で並べ替え</string>
<string name="feed_order_most_played">再生したエピソードの数で並べ替え</string>
<string name="drawer_feed_order_unplayed">未再生のエピソードの数</string>
<string name="drawer_feed_counter_downloaded">ダウンロード済のエピソードの数</string>
<string name="drawer_feed_counter_downloaded_unplayed">ダウンロード済と未再生のエピソードの数</string>
<string name="drawer_feed_counter_none">なし</string>
<string name="feed_order_unplayed_count">未再生のエピソードの数</string>
<string name="feed_counter_downloaded">ダウンロード済のエピソードの数</string>
<string name="feed_counter_downloaded_unplayed">ダウンロード済と未再生のエピソードの数</string>
<!--Bug report activity-->
<string name="log_file_share_exception">互換性のあるアプリが見つかりません</string>
<string name="export_logs_menu_title">詳細ログを出力する</string>

View File

@ -55,15 +55,13 @@
<string name="drawer_open">메뉴 열기</string>
<string name="drawer_close">메뉴 닫기</string>
<string name="drawer_preferences">드로어 기본 설정</string>
<string name="drawer_feed_order_unplayed_episodes">카운터로 정렬</string>
<string name="drawer_feed_order_alphabetical">사전 순서로 정렬</string>
<string name="drawer_feed_order_last_update">공개 날짜 순서대로 정렬</string>
<string name="drawer_feed_order_most_played">재생한 에피소드 개수에 따라 정렬</string>
<string name="feed_order_alphabetical">사전 순서로 정렬</string>
<string name="feed_order_last_update">공개 날짜 순서대로 정렬</string>
<string name="feed_order_most_played">재생한 에피소드 개수에 따라 정렬</string>
<string name="drawer_feed_order_unplayed">재생하지 않은 에피소드 수</string>
<string name="drawer_feed_counter_downloaded">다운로드한 에피소드 수</string>
<string name="drawer_feed_counter_downloaded_unplayed">다운로드 개수 및 재생하지 않은 에피소드</string>
<string name="drawer_feed_counter_none">없음</string>
<string name="feed_order_unplayed_count">재생하지 않은 에피소드 수</string>
<string name="feed_counter_downloaded">다운로드한 에피소드 수</string>
<string name="feed_counter_downloaded_unplayed">다운로드 개수 및 재생하지 않은 에피소드</string>
<!--Bug report activity-->
<string name="log_file_share_exception">호환되는 앱이 없습니다</string>
<string name="export_logs_menu_title">자세한 기록 내보내기</string>

View File

@ -36,13 +36,11 @@
<!--Main activity-->
<string name="drawer_open">Atverti meniu</string>
<string name="drawer_close">Užverti meniu</string>
<string name="drawer_feed_order_unplayed_episodes">Rikiuoti pagal skaitiklio reikšmę</string>
<string name="drawer_feed_order_alphabetical">Rikiuoti pagal abėcėlę</string>
<string name="drawer_feed_order_last_update">Rikiuoti pagal publikavimo datą</string>
<string name="drawer_feed_order_most_played">Rikiuoti pagal perklausytų epizodų skaičių</string>
<string name="drawer_feed_order_unplayed">Neperklausytų epizodų skaičius</string>
<string name="drawer_feed_counter_downloaded">Atsisiųstų epizodų skaičius</string>
<string name="drawer_feed_counter_none">Nieko</string>
<string name="feed_order_alphabetical">Rikiuoti pagal abėcėlę</string>
<string name="feed_order_last_update">Rikiuoti pagal publikavimo datą</string>
<string name="feed_order_most_played">Rikiuoti pagal perklausytų epizodų skaičių</string>
<string name="feed_order_unplayed_count">Neperklausytų epizodų skaičius</string>
<string name="feed_counter_downloaded">Atsisiųstų epizodų skaičius</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nerasta suderinamų programėlių</string>
<string name="export_logs_menu_title">Eksportuoti išsamų žurnalą</string>

View File

@ -55,15 +55,13 @@
<string name="drawer_open">Åpne menyen</string>
<string name="drawer_close">Lukk menyen</string>
<string name="drawer_preferences">Skuff-innstillinger</string>
<string name="drawer_feed_order_unplayed_episodes">Sorter på teller</string>
<string name="drawer_feed_order_alphabetical">Sorter alfabetisk</string>
<string name="drawer_feed_order_last_update">Sorter etter utgivelsesdato</string>
<string name="drawer_feed_order_most_played">Sorter etter antall avspilte episoder</string>
<string name="feed_order_alphabetical">Sorter alfabetisk</string>
<string name="feed_order_last_update">Sorter etter utgivelsesdato</string>
<string name="feed_order_most_played">Sorter etter antall avspilte episoder</string>
<string name="drawer_feed_order_unplayed">Antall uavspilte episoder</string>
<string name="drawer_feed_counter_downloaded">Antall nedlastede episoder</string>
<string name="drawer_feed_counter_downloaded_unplayed">Antall of nedlastede og uavspilte episoder</string>
<string name="drawer_feed_counter_none">Ingen</string>
<string name="feed_order_unplayed_count">Antall uavspilte episoder</string>
<string name="feed_counter_downloaded">Antall nedlastede episoder</string>
<string name="feed_counter_downloaded_unplayed">Antall of nedlastede og uavspilte episoder</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Fant ingen kompatible apper</string>
<string name="export_logs_menu_title">Eksport detaljert logfiler</string>

View File

@ -61,15 +61,13 @@
<string name="drawer_open">Menu openen</string>
<string name="drawer_close">Menu sluiten</string>
<string name="drawer_preferences">Menu instellen</string>
<string name="drawer_feed_order_unplayed_episodes">Op ingestelde teller</string>
<string name="drawer_feed_order_alphabetical">Op alfabetische volgorde</string>
<string name="drawer_feed_order_last_update">Op verschijningsdatum</string>
<string name="drawer_feed_order_most_played">Op aantal afgespeelde afleveringen</string>
<string name="feed_order_alphabetical">Op alfabetische volgorde</string>
<string name="feed_order_last_update">Op verschijningsdatum</string>
<string name="feed_order_most_played">Op aantal afgespeelde afleveringen</string>
<string name="drawer_feed_order_unplayed">Aantal niet afgespeelde afleveringen</string>
<string name="drawer_feed_counter_downloaded">Aantal gedownloade afleveringen</string>
<string name="drawer_feed_counter_downloaded_unplayed">Aantal gedownloade, onbeluisterde afleveringen</string>
<string name="drawer_feed_counter_none">Geen</string>
<string name="feed_order_unplayed_count">Aantal niet afgespeelde afleveringen</string>
<string name="feed_counter_downloaded">Aantal gedownloade afleveringen</string>
<string name="feed_counter_downloaded_unplayed">Aantal gedownloade, onbeluisterde afleveringen</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Geen compatibele apps aangetroffen</string>
<string name="export_logs_menu_title">Uitgebreide logboeken exporteren</string>

View File

@ -59,15 +59,13 @@
<string name="drawer_open">Otwórz menu</string>
<string name="drawer_close">Zamknij menu</string>
<string name="drawer_preferences">Ustawienia panelu nawigacyjnego</string>
<string name="drawer_feed_order_unplayed_episodes">Sortuj wg licznika</string>
<string name="drawer_feed_order_alphabetical">Sortuj alfabetycznie</string>
<string name="drawer_feed_order_last_update">Sortuj wg daty publikacji</string>
<string name="drawer_feed_order_most_played">Sortuj wg liczby odtworzonych odcinków</string>
<string name="feed_order_alphabetical">Sortuj alfabetycznie</string>
<string name="feed_order_last_update">Sortuj wg daty publikacji</string>
<string name="feed_order_most_played">Sortuj wg liczby odtworzonych odcinków</string>
<string name="drawer_feed_order_unplayed">Liczba nieodtworzonych odcinków</string>
<string name="drawer_feed_counter_downloaded">Liczba pobranych odcinków</string>
<string name="drawer_feed_counter_downloaded_unplayed">Liczba pobranych i nieodtworzonych odcinków</string>
<string name="drawer_feed_counter_none">Brak</string>
<string name="feed_order_unplayed_count">Liczba nieodtworzonych odcinków</string>
<string name="feed_counter_downloaded">Liczba pobranych odcinków</string>
<string name="feed_counter_downloaded_unplayed">Liczba pobranych i nieodtworzonych odcinków</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nie znaleziono kompatybilnych aplikacji</string>
<string name="export_logs_menu_title">Eksportuj szczegółowe logi</string>

View File

@ -58,15 +58,13 @@
<string name="drawer_open">Abrir menu</string>
<string name="drawer_close">Fechar menu</string>
<string name="drawer_preferences">Menu de navegação</string>
<string name="drawer_feed_order_unplayed_episodes">Ordenar por contador</string>
<string name="drawer_feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="drawer_feed_order_last_update">Ordenar por data de publicação</string>
<string name="drawer_feed_order_most_played">Ordenar pelo número de episódios reproduzidos</string>
<string name="feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="feed_order_last_update">Ordenar por data de publicação</string>
<string name="feed_order_most_played">Ordenar pelo número de episódios reproduzidos</string>
<string name="drawer_feed_order_unplayed">Número de episódios não reproduzidos</string>
<string name="drawer_feed_counter_downloaded">Número de episódios baixados</string>
<string name="drawer_feed_counter_downloaded_unplayed">Número de episódios baixados e não reproduzidos</string>
<string name="drawer_feed_counter_none">Nenhum</string>
<string name="feed_order_unplayed_count">Número de episódios não reproduzidos</string>
<string name="feed_counter_downloaded">Número de episódios baixados</string>
<string name="feed_counter_downloaded_unplayed">Número de episódios baixados e não reproduzidos</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nenhum aplicativo compatível encontrado</string>
<string name="export_logs_menu_title">Exportar relatórios detalhados</string>

View File

@ -60,15 +60,13 @@
<string name="drawer_open">Abrir menu</string>
<string name="drawer_close">Fechar menu</string>
<string name="drawer_preferences">Preferências do menu</string>
<string name="drawer_feed_order_unplayed_episodes">Ordenar por contador</string>
<string name="drawer_feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="drawer_feed_order_last_update">Ordenar por data de publicação</string>
<string name="drawer_feed_order_most_played">Ordenar por número de episódios reproduzidos</string>
<string name="feed_order_alphabetical">Ordenar alfabeticamente</string>
<string name="feed_order_last_update">Ordenar por data de publicação</string>
<string name="feed_order_most_played">Ordenar por número de episódios reproduzidos</string>
<string name="drawer_feed_order_unplayed">Número de episódios não reproduzidos</string>
<string name="drawer_feed_counter_downloaded">Número de episódios descarregados</string>
<string name="drawer_feed_counter_downloaded_unplayed">Número de episódios descarregados e não reproduzidos</string>
<string name="drawer_feed_counter_none">Nenhum</string>
<string name="feed_order_unplayed_count">Número de episódios não reproduzidos</string>
<string name="feed_counter_downloaded">Número de episódios descarregados</string>
<string name="feed_counter_downloaded_unplayed">Número de episódios descarregados e não reproduzidos</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Não existem aplicações compatíveis</string>
<string name="export_logs_menu_title">Exportar registos detalhados</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Deschide meniul</string>
<string name="drawer_close">Închide meniul</string>
<string name="drawer_preferences">Preferințe Sertar</string>
<string name="drawer_feed_order_unplayed_episodes">Sortează după număr</string>
<string name="drawer_feed_order_alphabetical">Sortează alfabetic</string>
<string name="drawer_feed_order_last_update">Sortează după data publicării</string>
<string name="drawer_feed_order_most_played">Sortează după numărul de episoade urmărite</string>
<string name="feed_order_alphabetical">Sortează alfabetic</string>
<string name="feed_order_last_update">Sortează după data publicării</string>
<string name="feed_order_most_played">Sortează după numărul de episoade urmărite</string>
<string name="drawer_feed_order_unplayed">Numărul de episoade neredate</string>
<string name="drawer_feed_counter_downloaded">Numărul de episoade descărcate</string>
<string name="drawer_feed_counter_downloaded_unplayed">Numărul de episoade descărcate și neredate</string>
<string name="drawer_feed_counter_none">Niciunul</string>
<string name="feed_order_unplayed_count">Numărul de episoade neredate</string>
<string name="feed_counter_downloaded">Numărul de episoade descărcate</string>
<string name="feed_counter_downloaded_unplayed">Numărul de episoade descărcate și neredate</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Nicio aplicație compatibilă nu a fost găsită</string>
<string name="export_logs_menu_title">Exportă log-uri detaliate</string>

View File

@ -55,15 +55,13 @@
<string name="drawer_open">Открыть меню</string>
<string name="drawer_close">Закрыть меню</string>
<string name="drawer_preferences">Настройка бокового меню</string>
<string name="drawer_feed_order_unplayed_episodes">По количеству</string>
<string name="drawer_feed_order_alphabetical">По алфавиту</string>
<string name="drawer_feed_order_last_update">По дате выхода</string>
<string name="drawer_feed_order_most_played">По количеству прослушанных</string>
<string name="feed_order_alphabetical">По алфавиту</string>
<string name="feed_order_last_update">По дате выхода</string>
<string name="feed_order_most_played">По количеству прослушанных</string>
<string name="drawer_feed_order_unplayed">Количество непрослушанных выпусков</string>
<string name="drawer_feed_counter_downloaded">Количество загруженных выпусков</string>
<string name="drawer_feed_counter_downloaded_unplayed">Количество загруженных и непрослушанных выпусков</string>
<string name="drawer_feed_counter_none">Ничего</string>
<string name="feed_order_unplayed_count">Количество непрослушанных выпусков</string>
<string name="feed_counter_downloaded">Количество загруженных выпусков</string>
<string name="feed_counter_downloaded_unplayed">Количество загруженных и непрослушанных выпусков</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Совместимых приложений не найдено</string>
<string name="export_logs_menu_title">Экспортировать подробные журналы</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Otvoriť menu</string>
<string name="drawer_close">Zatvoriť menu</string>
<string name="drawer_preferences">Nastavenie navigačného panela</string>
<string name="drawer_feed_order_unplayed_episodes">Usporiadať podľa počítadla</string>
<string name="drawer_feed_order_alphabetical">Usporiadať abecedne</string>
<string name="drawer_feed_order_last_update">Usporiadať podľa dátumu zverejnenia</string>
<string name="drawer_feed_order_most_played">Usporiadať podľa počtu prehraných epizód</string>
<string name="feed_order_alphabetical">Usporiadať abecedne</string>
<string name="feed_order_last_update">Usporiadať podľa dátumu zverejnenia</string>
<string name="feed_order_most_played">Usporiadať podľa počtu prehraných epizód</string>
<string name="drawer_feed_order_unplayed">Počet neprehraných epizód</string>
<string name="drawer_feed_counter_downloaded">Počet stiahnutých epizód</string>
<string name="drawer_feed_counter_downloaded_unplayed">Počet stiahnutých a neprehratých epizód</string>
<string name="drawer_feed_counter_none">Žiadne</string>
<string name="feed_order_unplayed_count">Počet neprehraných epizód</string>
<string name="feed_counter_downloaded">Počet stiahnutých epizód</string>
<string name="feed_counter_downloaded_unplayed">Počet stiahnutých a neprehratých epizód</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Žiadne kompatibilné aplikácie</string>
<string name="export_logs_menu_title">Exportovať podrobné záznamy</string>

View File

@ -35,13 +35,11 @@
<!--Main activity-->
<string name="drawer_open">Odpri meni</string>
<string name="drawer_close">Zapri meni</string>
<string name="drawer_feed_order_unplayed_episodes">Razvrsti po števcu</string>
<string name="drawer_feed_order_alphabetical">Razvrsti po abecedi</string>
<string name="drawer_feed_order_last_update">Razvrsti po datumu objave</string>
<string name="drawer_feed_order_most_played">Razvrsti po številu predvajanih epizod</string>
<string name="drawer_feed_order_unplayed">Število nepredvajanih epizod</string>
<string name="drawer_feed_counter_downloaded">Število prenesenih epizod</string>
<string name="drawer_feed_counter_none">Nič</string>
<string name="feed_order_alphabetical">Razvrsti po abecedi</string>
<string name="feed_order_last_update">Razvrsti po datumu objave</string>
<string name="feed_order_most_played">Razvrsti po številu predvajanih epizod</string>
<string name="feed_order_unplayed_count">Število nepredvajanih epizod</string>
<string name="feed_counter_downloaded">Število prenesenih epizod</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Ni bilo najdenih združljivih aplikacij</string>
<string name="export_logs_menu_title">Izvozi podrobne dnevnike</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Öppna meny</string>
<string name="drawer_close">Stäng meny</string>
<string name="drawer_preferences">Menyinställningar</string>
<string name="drawer_feed_order_unplayed_episodes">Sortera efter antal ospelade</string>
<string name="drawer_feed_order_alphabetical">Sortera alfabetiskt</string>
<string name="drawer_feed_order_last_update">Sortera efter publiceringsdatum</string>
<string name="drawer_feed_order_most_played">Sortera efter antal spelade episoder</string>
<string name="feed_order_alphabetical">Sortera alfabetiskt</string>
<string name="feed_order_last_update">Sortera efter publiceringsdatum</string>
<string name="feed_order_most_played">Sortera efter antal spelade episoder</string>
<string name="drawer_feed_order_unplayed">Antal ospelade episoder</string>
<string name="drawer_feed_counter_downloaded">Antal nedladdade episoder</string>
<string name="drawer_feed_counter_downloaded_unplayed">Antal nedladdade och ospelade avsnitt</string>
<string name="drawer_feed_counter_none">Inga</string>
<string name="feed_order_unplayed_count">Antal ospelade episoder</string>
<string name="feed_counter_downloaded">Antal nedladdade episoder</string>
<string name="feed_counter_downloaded_unplayed">Antal nedladdade och ospelade avsnitt</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Hittade inga kompatibla appar</string>
<string name="export_logs_menu_title">Exportera detaljerade loggar</string>

View File

@ -60,15 +60,13 @@
<string name="drawer_open">Münüyü aç</string>
<string name="drawer_close">Menüyü kapat</string>
<string name="drawer_preferences">İzni reddettiniz.</string>
<string name="drawer_feed_order_unplayed_episodes">Sayaca göre sırala</string>
<string name="drawer_feed_order_alphabetical">Alfabetik olarak sırala</string>
<string name="drawer_feed_order_last_update">Yayınlanma tarihine göre sırala</string>
<string name="drawer_feed_order_most_played">Oynatılan bölüm sayısına göre sırala</string>
<string name="feed_order_alphabetical">Alfabetik olarak sırala</string>
<string name="feed_order_last_update">Yayınlanma tarihine göre sırala</string>
<string name="feed_order_most_played">Oynatılan bölüm sayısına göre sırala</string>
<string name="drawer_feed_order_unplayed">Çalınmamış bölümlerin sayısı</string>
<string name="drawer_feed_counter_downloaded">İndirilen bölümlerin sayısı</string>
<string name="drawer_feed_counter_downloaded_unplayed">İndirilen ve oynatılmamış bölümlerin sayısı</string>
<string name="drawer_feed_counter_none">Hiçbiri</string>
<string name="feed_order_unplayed_count">Çalınmamış bölümlerin sayısı</string>
<string name="feed_counter_downloaded">İndirilen bölümlerin sayısı</string>
<string name="feed_counter_downloaded_unplayed">İndirilen ve oynatılmamış bölümlerin sayısı</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Uyumlu uygulama bulunamadı</string>
<string name="export_logs_menu_title">Ayrıntılı günlükleri dışa aktar</string>

View File

@ -57,15 +57,13 @@
<string name="drawer_open">Показати меню</string>
<string name="drawer_close">Сховати меню</string>
<string name="drawer_preferences">Налаштування шторки</string>
<string name="drawer_feed_order_unplayed_episodes">Сортувати за лічильником</string>
<string name="drawer_feed_order_alphabetical">Сортувати за абеткою</string>
<string name="drawer_feed_order_last_update">Сортувати за датою публікації</string>
<string name="drawer_feed_order_most_played">Сортувати за кількістю прослуханих епізодів</string>
<string name="feed_order_alphabetical">Сортувати за абеткою</string>
<string name="feed_order_last_update">Сортувати за датою публікації</string>
<string name="feed_order_most_played">Сортувати за кількістю прослуханих епізодів</string>
<string name="drawer_feed_order_unplayed">Кількість непрослуханих епізодів</string>
<string name="drawer_feed_counter_downloaded">Кількість завантажених епізодів</string>
<string name="drawer_feed_counter_downloaded_unplayed">Кількість завантажених але не прослуханих епізодів</string>
<string name="drawer_feed_counter_none">Немає</string>
<string name="feed_order_unplayed_count">Кількість непрослуханих епізодів</string>
<string name="feed_counter_downloaded">Кількість завантажених епізодів</string>
<string name="feed_counter_downloaded_unplayed">Кількість завантажених але не прослуханих епізодів</string>
<!--Bug report activity-->
<string name="log_file_share_exception">Сумісних програм не знайдено</string>
<string name="export_logs_menu_title">Експорт детальних журналів</string>

View File

@ -61,15 +61,13 @@
<string name="drawer_open">打开菜单</string>
<string name="drawer_close">关闭菜单</string>
<string name="drawer_preferences">抽屉选项</string>
<string name="drawer_feed_order_unplayed_episodes">按数量排序</string>
<string name="drawer_feed_order_alphabetical">按名称排序</string>
<string name="drawer_feed_order_last_update">按出版日期排序</string>
<string name="drawer_feed_order_most_played">根据已播放节目的数量排序</string>
<string name="feed_order_alphabetical">按名称排序</string>
<string name="feed_order_last_update">按出版日期排序</string>
<string name="feed_order_most_played">根据已播放节目的数量排序</string>
<string name="drawer_feed_order_unplayed">未播曲目数</string>
<string name="drawer_feed_counter_downloaded">已下载节目数</string>
<string name="drawer_feed_counter_downloaded_unplayed">已下载但未播放的节目数</string>
<string name="drawer_feed_counter_none"></string>
<string name="feed_order_unplayed_count">未播曲目数</string>
<string name="feed_counter_downloaded">已下载节目数</string>
<string name="feed_counter_downloaded_unplayed">已下载但未播放的节目数</string>
<!--Bug report activity-->
<string name="log_file_share_exception">没有找到兼容的应用程序</string>
<string name="export_logs_menu_title">导出详细日志</string>

View File

@ -34,13 +34,11 @@
</string>
<string name="drawer_open">打開選單</string>
<string name="drawer_close">關閉選單</string>
<string name="drawer_feed_order_unplayed_episodes">按計數器排序</string>
<string name="drawer_feed_order_alphabetical">按字母排序</string>
<string name="drawer_feed_order_last_update">按發布日期排序</string>
<string name="drawer_feed_order_most_played">按已播放的集數排序</string>
<string name="drawer_feed_order_unplayed">未播放集數</string>
<string name="drawer_feed_counter_downloaded">已下載集數</string>
<string name="drawer_feed_counter_none">沒有</string>
<string name="feed_order_alphabetical">按字母排序</string>
<string name="feed_order_last_update">按發布日期排序</string>
<string name="feed_order_most_played">按已播放的集數排序</string>
<string name="feed_order_unplayed_count">未播放集數</string>
<string name="feed_counter_downloaded">已下載集數</string>
<!--Bug report activity-->
<string name="log_file_share_exception">找不到相容的 App</string>
<string name="export_logs_menu_title">匯出詳細記錄</string>

View File

@ -188,38 +188,25 @@
<item>3</item>
</string-array>
<string-array name="nav_drawer_feed_order_options">
<item>@string/drawer_feed_order_unplayed</item>
<item>@string/drawer_feed_order_alphabetical</item>
<item>@string/drawer_feed_order_last_update</item>
<item>@string/drawer_feed_order_last_unread_update</item>
<item>@string/drawer_feed_order_most_played</item>
<item>@string/drawer_feed_counter_downloaded</item>
<item>@string/drawer_feed_counter_downloaded_unplayed</item>
<item>@string/drawer_feed_order_new_episodes</item>
</string-array>
<string-array name="nav_drawer_feed_order_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
</string-array>
<!-- <string-array name="nav_drawer_feed_counter_options">-->
<!-- <item>@string/drawer_feed_order_unplayed</item>-->
<!-- <item>@string/drawer_feed_counter_downloaded</item>-->
<!-- <item>@string/drawer_feed_counter_downloaded_unplayed</item>-->
<!-- <item>@string/drawer_feed_counter_none</item>-->
<!-- <string-array name="nav_drawer_feed_order_options">-->
<!-- <item>@string/feed_order_unplayed_count</item>-->
<!-- <item>@string/feed_order_alphabetical</item>-->
<!-- <item>@string/feed_order_last_update</item>-->
<!-- <item>@string/feed_order_last_unread_update</item>-->
<!-- <item>@string/feed_order_most_played</item>-->
<!-- <item>@string/feed_counter_downloaded</item>-->
<!-- <item>@string/feed_counter_downloaded_unplayed</item>-->
<!-- <item>@string/feed_order_new_episodes</item>-->
<!-- </string-array>-->
<!-- <string-array name="nav_drawer_feed_counter_values">-->
<!-- <string-array name="nav_drawer_feed_order_values">-->
<!-- <item>0</item>-->
<!-- <item>1</item>-->
<!-- <item>2</item>-->
<!-- <item>3</item>-->
<!-- <item>4</item>-->
<!-- <item>5</item>-->
<!-- <item>3</item>-->
<!-- <item>6</item>-->
<!-- <item>7</item>-->
<!-- </string-array>-->
<string-array name="full_notification_buttons_options">

View File

@ -78,17 +78,15 @@
<string name="drawer_open">Open menu</string>
<string name="drawer_close">Close menu</string>
<string name="drawer_preferences">Drawer preferences</string>
<string name="drawer_feed_order_unplayed_episodes">Counter</string>
<string name="drawer_feed_order_alphabetical">Title</string>
<string name="drawer_feed_order_last_update">Publication date</string>
<string name="drawer_feed_order_last_unread_update">Unread publication date</string>
<string name="drawer_feed_order_most_played">Number of played episodes</string>
<string name="drawer_feed_order_new_episodes">Number of new episodes</string>
<string name="drawer_feed_order_unplayed">Number of unplayed episodes</string>
<string name="drawer_feed_counter_downloaded">Number of downloaded episodes</string>
<string name="drawer_feed_counter_downloaded_unplayed">Number of downloaded and unplayed episodes</string>
<string name="drawer_feed_counter_none">None</string>
<string name="feed_order_alphabetical">Title</string>
<string name="feed_order_last_update">Publish date</string>
<string name="feed_order_last_unread_update">Unplayed publish date</string>
<string name="feed_order_most_played">Played count</string>
<string name="feed_order_new_episodes">New count</string>
<string name="feed_order_unplayed_count">Unplayed count</string>
<string name="feed_counter_downloaded">Download count</string>
<string name="feed_counter_downloaded_unplayed">Unplayed download count</string>
<!-- Bug report activity -->
<string name="log_file_share_exception">No compatible apps found</string>

View File

@ -2,7 +2,7 @@ package ac.mdiq.podcini.feed
import ac.mdiq.podcini.feed.FeedMother.anyFeed
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import junit.framework.TestCase.assertEquals
import org.junit.Assert
import org.junit.Before
@ -67,8 +67,8 @@ class FeedTest {
@Test
@Throws(Exception::class)
fun testSetSortOrder_OnlyIntraFeedSortAllowed() {
for (sortOrder in SortOrder.entries) {
if (sortOrder.scope == SortOrder.Scope.INTRA_FEED) {
for (sortOrder in EpisodeSortOrder.entries) {
if (sortOrder.scope == EpisodeSortOrder.Scope.INTRA_FEED) {
original!!.sortOrder = sortOrder // should be okay
} else {
try {

View File

@ -10,7 +10,7 @@ import ac.mdiq.podcini.storage.database.Feeds.getFeedListDownloadUrls
import ac.mdiq.podcini.storage.database.Queues.getInQueueEpisodeIds
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeFilter
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import ac.mdiq.podcini.ui.fragment.HistoryFragment.Companion.getHistory
import ac.mdiq.podcini.ui.fragment.HistoryFragment.Companion.getNumberOfCompleted
import ac.mdiq.podcini.ui.fragment.NavDrawerFragment.Companion.getDatasetStats
@ -223,7 +223,7 @@ class DbReaderTest {
fun testGetDownloadedItems() {
val numItems = 10
val downloaded = saveDownloadedItems(numItems)
val downloadedSaved = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), SortOrder.DATE_NEW_OLD)
val downloadedSaved = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.DOWNLOADED), EpisodeSortOrder.DATE_NEW_OLD)
Assert.assertNotNull(downloadedSaved)
Assert.assertEquals(downloaded.size.toLong(), downloadedSaved.size.toLong())
for (item in downloadedSaved) {
@ -266,7 +266,7 @@ class DbReaderTest {
for (i in newItems.indices) {
unreadIds[i] = newItems[i].id
}
val newItemsSaved = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.NEW), SortOrder.DATE_NEW_OLD)
val newItemsSaved = getEpisodes(0, Int.MAX_VALUE, EpisodeFilter(EpisodeFilter.NEW), EpisodeSortOrder.DATE_NEW_OLD)
Assert.assertNotNull(newItemsSaved)
Assert.assertEquals(newItemsSaved.size.toLong(), newItems.size.toLong())
for (feedItem in newItemsSaved) {

View File

@ -4,7 +4,7 @@ import ac.mdiq.podcini.util.sorting.EpisodesPermutors.getPermutor
import ac.mdiq.podcini.storage.model.Feed
import ac.mdiq.podcini.storage.model.Episode
import ac.mdiq.podcini.storage.model.EpisodeMedia
import ac.mdiq.podcini.storage.model.SortOrder
import ac.mdiq.podcini.storage.model.EpisodeSortOrder
import org.junit.Assert
import org.junit.Test
import java.util.*
@ -15,7 +15,7 @@ import java.util.*
class EpisodePermutorsTest {
@Test
fun testEnsureNonNullPermutors() {
for (sortOrder in SortOrder.entries) {
for (sortOrder in EpisodeSortOrder.entries) {
Assert.assertNotNull("The permutor for SortOrder $sortOrder is unexpectedly null",
getPermutor(sortOrder))
}
@ -23,7 +23,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_EPISODE_TITLE_ASC() {
val permutor = getPermutor(SortOrder.EPISODE_TITLE_A_Z)
val permutor = getPermutor(EpisodeSortOrder.EPISODE_TITLE_A_Z)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -33,7 +33,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_EPISODE_TITLE_ASC_NullTitle() {
val permutor = getPermutor(SortOrder.EPISODE_TITLE_A_Z)
val permutor = getPermutor(EpisodeSortOrder.EPISODE_TITLE_A_Z)
val itemList = testList.toMutableList()
itemList[2].title = (null)
@ -45,7 +45,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_EPISODE_TITLE_DESC() {
val permutor = getPermutor(SortOrder.EPISODE_TITLE_Z_A)
val permutor = getPermutor(EpisodeSortOrder.EPISODE_TITLE_Z_A)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -55,7 +55,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DATE_ASC() {
val permutor = getPermutor(SortOrder.DATE_OLD_NEW)
val permutor = getPermutor(EpisodeSortOrder.DATE_OLD_NEW)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -65,7 +65,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DATE_ASC_NulPubDatel() {
val permutor = getPermutor(SortOrder.DATE_OLD_NEW)
val permutor = getPermutor(EpisodeSortOrder.DATE_OLD_NEW)
val itemList = testList
itemList[2] // itemId 2
@ -77,7 +77,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DATE_DESC() {
val permutor = getPermutor(SortOrder.DATE_NEW_OLD)
val permutor = getPermutor(EpisodeSortOrder.DATE_NEW_OLD)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -87,7 +87,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DURATION_ASC() {
val permutor = getPermutor(SortOrder.DURATION_SHORT_LONG)
val permutor = getPermutor(EpisodeSortOrder.DURATION_SHORT_LONG)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -97,7 +97,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DURATION_DESC() {
val permutor = getPermutor(SortOrder.DURATION_LONG_SHORT)
val permutor = getPermutor(EpisodeSortOrder.DURATION_LONG_SHORT)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -107,7 +107,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_size_asc() {
val permutor = getPermutor(SortOrder.SIZE_SMALL_LARGE)
val permutor = getPermutor(EpisodeSortOrder.SIZE_SMALL_LARGE)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -117,7 +117,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_size_desc() {
val permutor = getPermutor(SortOrder.SIZE_LARGE_SMALL)
val permutor = getPermutor(EpisodeSortOrder.SIZE_LARGE_SMALL)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -127,7 +127,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_DURATION_DESC_NullMedia() {
val permutor = getPermutor(SortOrder.DURATION_LONG_SHORT)
val permutor = getPermutor(EpisodeSortOrder.DURATION_LONG_SHORT)
val itemList = testList
itemList[1] // itemId 3
@ -139,7 +139,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_FEED_TITLE_ASC() {
val permutor = getPermutor(SortOrder.FEED_TITLE_A_Z)
val permutor = getPermutor(EpisodeSortOrder.FEED_TITLE_A_Z)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -149,7 +149,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_FEED_TITLE_DESC() {
val permutor = getPermutor(SortOrder.FEED_TITLE_Z_A)
val permutor = getPermutor(EpisodeSortOrder.FEED_TITLE_Z_A)
val itemList = testList
Assert.assertTrue(checkIdOrder(itemList, 1, 3, 2)) // before sorting
@ -159,7 +159,7 @@ class EpisodePermutorsTest {
@Test
fun testPermutorForRule_FEED_TITLE_DESC_NullTitle() {
val permutor = getPermutor(SortOrder.FEED_TITLE_Z_A)
val permutor = getPermutor(EpisodeSortOrder.FEED_TITLE_Z_A)
val itemList = testList
itemList[1].feed!!.title = (null)

View File

@ -1,3 +1,10 @@
## 6.0.7
* feeds sorting is bi-directional and in the same style as episodes sorting
* feed order names changed in English (other languages need update)
* date of new episode is highlighted in episodes list views
* fixed issue of tags not being properly handled
## 6.0.6
* minor class re-structuring

View File

@ -0,0 +1,7 @@
Version 6.0.7 brings several changes:
* feeds sorting is bi-directional and in the same style as episodes sorting
* feed order names changed in English (other languages need update)
* date of new episode is highlighted in episodes list views
* fixed issue of tags not being properly handled