Support fast forward / rewind seconds setting.

This commit is contained in:
stonegate 2020-07-25 01:17:47 +08:00
parent 0bff5b8f3b
commit 01d21940d4
21 changed files with 328 additions and 90 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

View File

@ -63,17 +63,19 @@ class MessageLookup extends MessageLookupByLibrary {
static m21(date) => "Removed at ${date}"; static m21(date) => "Removed at ${date}";
static m22(count) => "${Intl.plural(count, zero: 'Just now', one: '${count} second ago', other: '${count} seconds ago')}"; static m22(count) => "${Intl.plural(count, zero: '0 sec', one: '${count} sec', other: '${count} sec')}";
static m23(time) => "Last time ${time}"; static m23(count) => "${Intl.plural(count, zero: 'Just now', one: '${count} second ago', other: '${count} seconds ago')}";
static m24(time) => "${time} Left"; static m24(time) => "Last time ${time}";
static m25(time) => "To ${time}"; static m25(time) => "${time} Left";
static m26(count) => "${Intl.plural(count, zero: 'No update', one: 'Updated ${count} episode', other: 'Updated ${count} episodes')}"; static m26(time) => "To ${time}";
static m27(version) => "Version : ${version}"; static m27(count) => "${Intl.plural(count, zero: 'No update', one: 'Updated ${count} episode', other: 'Updated ${count} episodes')}";
static m28(version) => "Version : ${version}";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> { static _notInlinedMessages(_) => <String, Function> {
@ -187,6 +189,7 @@ class MessageLookup extends MessageLookupByLibrary {
"notificationUpdateError" : m18, "notificationUpdateError" : m18,
"oldestFirst" : MessageLookupByLibrary.simpleMessage("Oldest first"), "oldestFirst" : MessageLookupByLibrary.simpleMessage("Oldest first"),
"play" : MessageLookupByLibrary.simpleMessage("Play"), "play" : MessageLookupByLibrary.simpleMessage("Play"),
"playback" : MessageLookupByLibrary.simpleMessage("Playback control"),
"playing" : MessageLookupByLibrary.simpleMessage("Playing"), "playing" : MessageLookupByLibrary.simpleMessage("Playing"),
"plugins" : MessageLookupByLibrary.simpleMessage("Plugins"), "plugins" : MessageLookupByLibrary.simpleMessage("Plugins"),
"podcast" : m19, "podcast" : m19,
@ -214,7 +217,8 @@ class MessageLookup extends MessageLookupByLibrary {
"searchEpisode" : MessageLookupByLibrary.simpleMessage("Search episode"), "searchEpisode" : MessageLookupByLibrary.simpleMessage("Search episode"),
"searchInvalidRss" : MessageLookupByLibrary.simpleMessage("Invalid RSS link"), "searchInvalidRss" : MessageLookupByLibrary.simpleMessage("Invalid RSS link"),
"searchPodcast" : MessageLookupByLibrary.simpleMessage("Search podcast"), "searchPodcast" : MessageLookupByLibrary.simpleMessage("Search podcast"),
"secondsAgo" : m22, "secCount" : m22,
"secondsAgo" : m23,
"settingStorage" : MessageLookupByLibrary.simpleMessage("Storage"), "settingStorage" : MessageLookupByLibrary.simpleMessage("Storage"),
"settings" : MessageLookupByLibrary.simpleMessage("Settings"), "settings" : MessageLookupByLibrary.simpleMessage("Settings"),
"settingsAccentColor" : MessageLookupByLibrary.simpleMessage("Accent color"), "settingsAccentColor" : MessageLookupByLibrary.simpleMessage("Accent color"),
@ -238,6 +242,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("Enable syncing"), "settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("Enable syncing"),
"settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("Refresh all podcasts in the background to get leatest episodes"), "settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("Refresh all podcasts in the background to get leatest episodes"),
"settingsExportDes" : MessageLookupByLibrary.simpleMessage("Export and import app settings"), "settingsExportDes" : MessageLookupByLibrary.simpleMessage("Export and import app settings"),
"settingsFastForwardSec" : MessageLookupByLibrary.simpleMessage("Fast forward seconds"),
"settingsFastForwardSecDes" : MessageLookupByLibrary.simpleMessage("Change the fast forward seconds in player"),
"settingsFeedback" : MessageLookupByLibrary.simpleMessage("Feedback"), "settingsFeedback" : MessageLookupByLibrary.simpleMessage("Feedback"),
"settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("Bugs and features request"), "settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("Bugs and features request"),
"settingsHistory" : MessageLookupByLibrary.simpleMessage("History"), "settingsHistory" : MessageLookupByLibrary.simpleMessage("History"),
@ -263,6 +269,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsPrefrence" : MessageLookupByLibrary.simpleMessage("Prefrence"), "settingsPrefrence" : MessageLookupByLibrary.simpleMessage("Prefrence"),
"settingsRealDark" : MessageLookupByLibrary.simpleMessage("Real dark"), "settingsRealDark" : MessageLookupByLibrary.simpleMessage("Real dark"),
"settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("Turn on if you think the night is not dark enough"), "settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("Turn on if you think the night is not dark enough"),
"settingsRewindSec" : MessageLookupByLibrary.simpleMessage("Rewind seconds"),
"settingsRewindSecDes" : MessageLookupByLibrary.simpleMessage("Change the rewind seconds in player"),
"settingsSTAuto" : MessageLookupByLibrary.simpleMessage("Auto turn on sleep timer"), "settingsSTAuto" : MessageLookupByLibrary.simpleMessage("Auto turn on sleep timer"),
"settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("Auto start sleep timer at scheduled time"), "settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("Auto start sleep timer at scheduled time"),
"settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("Default time"), "settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("Default time"),
@ -283,9 +291,9 @@ class MessageLookup extends MessageLookupByLibrary {
"subscribe" : MessageLookupByLibrary.simpleMessage("Subscribe"), "subscribe" : MessageLookupByLibrary.simpleMessage("Subscribe"),
"subscribeExportDes" : MessageLookupByLibrary.simpleMessage("Export OMPL file of all podcasts"), "subscribeExportDes" : MessageLookupByLibrary.simpleMessage("Export OMPL file of all podcasts"),
"systemDefault" : MessageLookupByLibrary.simpleMessage("System default"), "systemDefault" : MessageLookupByLibrary.simpleMessage("System default"),
"timeLastPlayed" : m23, "timeLastPlayed" : m24,
"timeLeft" : m24, "timeLeft" : m25,
"to" : m25, "to" : m26,
"toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("Added to playlist"), "toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("Added to playlist"),
"toastDiscovery" : MessageLookupByLibrary.simpleMessage("Discovery feature reopened, pleast restart the app"), "toastDiscovery" : MessageLookupByLibrary.simpleMessage("Discovery feature reopened, pleast restart the app"),
"toastFileError" : MessageLookupByLibrary.simpleMessage("File error, subscribe failed"), "toastFileError" : MessageLookupByLibrary.simpleMessage("File error, subscribe failed"),
@ -306,8 +314,8 @@ class MessageLookup extends MessageLookupByLibrary {
"unlike" : MessageLookupByLibrary.simpleMessage("Unlike"), "unlike" : MessageLookupByLibrary.simpleMessage("Unlike"),
"unliked" : MessageLookupByLibrary.simpleMessage("Episode removed from favorite"), "unliked" : MessageLookupByLibrary.simpleMessage("Episode removed from favorite"),
"updateDate" : MessageLookupByLibrary.simpleMessage("Update date"), "updateDate" : MessageLookupByLibrary.simpleMessage("Update date"),
"updateEpisodesCount" : m26, "updateEpisodesCount" : m27,
"updateFailed" : MessageLookupByLibrary.simpleMessage("Update failed, network error"), "updateFailed" : MessageLookupByLibrary.simpleMessage("Update failed, network error"),
"version" : m27 "version" : m28
}; };
} }

View File

@ -63,17 +63,19 @@ class MessageLookup extends MessageLookupByLibrary {
static m21(date) => "Supprimé le ${date}"; static m21(date) => "Supprimé le ${date}";
static m22(count) => "${Intl.plural(count, zero: 'A l\'instant', one: 'Il y a ${count} seconde', other: 'Il y a ${count} secondes')}"; static m22(count) => "${Intl.plural(count, zero: '0 sec', one: '${count} sec', other: '${count} sec')}";
static m23(time) => "Dernière écoute à ${time}"; static m23(count) => "${Intl.plural(count, zero: 'A l\'instant', one: 'Il y a ${count} seconde', other: 'Il y a ${count} secondes')}";
static m24(time) => "${time} Restant"; static m24(time) => "Dernière écoute à ${time}";
static m25(time) => "Jusqu\'à ${time}"; static m25(time) => "${time} Restant";
static m26(count) => "${Intl.plural(count, zero: 'Aucune mise à jour.', one: 'Mise à jour d\'${count} épisode.', other: 'Mise à jour de ${count} épisodes.')}"; static m26(time) => "Jusqu\'à ${time}";
static m27(version) => "Version : ${version}"; static m27(count) => "${Intl.plural(count, zero: 'Aucune mise à jour.', one: 'Mise à jour d\'${count} épisode.', other: 'Mise à jour de ${count} épisodes.')}";
static m28(version) => "Version : ${version}";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> { static _notInlinedMessages(_) => <String, Function> {
@ -187,6 +189,7 @@ class MessageLookup extends MessageLookupByLibrary {
"notificationUpdateError" : m18, "notificationUpdateError" : m18,
"oldestFirst" : MessageLookupByLibrary.simpleMessage("Le plus ancien en premier."), "oldestFirst" : MessageLookupByLibrary.simpleMessage("Le plus ancien en premier."),
"play" : MessageLookupByLibrary.simpleMessage("Lecture"), "play" : MessageLookupByLibrary.simpleMessage("Lecture"),
"playback" : MessageLookupByLibrary.simpleMessage("Playback control"),
"playing" : MessageLookupByLibrary.simpleMessage("En cours"), "playing" : MessageLookupByLibrary.simpleMessage("En cours"),
"plugins" : MessageLookupByLibrary.simpleMessage("Plugins"), "plugins" : MessageLookupByLibrary.simpleMessage("Plugins"),
"podcast" : m19, "podcast" : m19,
@ -214,7 +217,8 @@ class MessageLookup extends MessageLookupByLibrary {
"searchEpisode" : MessageLookupByLibrary.simpleMessage("Search episode"), "searchEpisode" : MessageLookupByLibrary.simpleMessage("Search episode"),
"searchInvalidRss" : MessageLookupByLibrary.simpleMessage("Lien RSS invalide"), "searchInvalidRss" : MessageLookupByLibrary.simpleMessage("Lien RSS invalide"),
"searchPodcast" : MessageLookupByLibrary.simpleMessage("Chercher un podcast"), "searchPodcast" : MessageLookupByLibrary.simpleMessage("Chercher un podcast"),
"secondsAgo" : m22, "secCount" : m22,
"secondsAgo" : m23,
"settingStorage" : MessageLookupByLibrary.simpleMessage("Espace de stockage"), "settingStorage" : MessageLookupByLibrary.simpleMessage("Espace de stockage"),
"settings" : MessageLookupByLibrary.simpleMessage("Paramètres"), "settings" : MessageLookupByLibrary.simpleMessage("Paramètres"),
"settingsAccentColor" : MessageLookupByLibrary.simpleMessage("Couleur principale"), "settingsAccentColor" : MessageLookupByLibrary.simpleMessage("Couleur principale"),
@ -238,6 +242,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("Activer la synchronisation"), "settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("Activer la synchronisation"),
"settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("Actualisez tous les podcasts en arrière-plan pour toujours afficher les derniers épisodes"), "settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("Actualisez tous les podcasts en arrière-plan pour toujours afficher les derniers épisodes"),
"settingsExportDes" : MessageLookupByLibrary.simpleMessage("Exporter et importer les paramètres de l\'application"), "settingsExportDes" : MessageLookupByLibrary.simpleMessage("Exporter et importer les paramètres de l\'application"),
"settingsFastForwardSec" : MessageLookupByLibrary.simpleMessage("Fast forward seconds"),
"settingsFastForwardSecDes" : MessageLookupByLibrary.simpleMessage("Change the fast forward seconds in player"),
"settingsFeedback" : MessageLookupByLibrary.simpleMessage("Feedback"), "settingsFeedback" : MessageLookupByLibrary.simpleMessage("Feedback"),
"settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("Report de bugs et demande d\'ajout de fonction"), "settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("Report de bugs et demande d\'ajout de fonction"),
"settingsHistory" : MessageLookupByLibrary.simpleMessage("Historique"), "settingsHistory" : MessageLookupByLibrary.simpleMessage("Historique"),
@ -263,6 +269,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsPrefrence" : MessageLookupByLibrary.simpleMessage("Préférences"), "settingsPrefrence" : MessageLookupByLibrary.simpleMessage("Préférences"),
"settingsRealDark" : MessageLookupByLibrary.simpleMessage("Noir profond"), "settingsRealDark" : MessageLookupByLibrary.simpleMessage("Noir profond"),
"settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("Activez pour un mode sombre accentué"), "settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("Activez pour un mode sombre accentué"),
"settingsRewindSec" : MessageLookupByLibrary.simpleMessage("Rewind seconds"),
"settingsRewindSecDes" : MessageLookupByLibrary.simpleMessage("Change the rewind seconds in player"),
"settingsSTAuto" : MessageLookupByLibrary.simpleMessage("Activation automatique de la minuterie"), "settingsSTAuto" : MessageLookupByLibrary.simpleMessage("Activation automatique de la minuterie"),
"settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("Démarrer la minuterie à l\'horaire programmé"), "settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("Démarrer la minuterie à l\'horaire programmé"),
"settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("Temps par défaut"), "settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("Temps par défaut"),
@ -283,9 +291,9 @@ class MessageLookup extends MessageLookupByLibrary {
"subscribe" : MessageLookupByLibrary.simpleMessage("Abonnements"), "subscribe" : MessageLookupByLibrary.simpleMessage("Abonnements"),
"subscribeExportDes" : MessageLookupByLibrary.simpleMessage("Exporter le fichier OPML de tous les podcasts"), "subscribeExportDes" : MessageLookupByLibrary.simpleMessage("Exporter le fichier OPML de tous les podcasts"),
"systemDefault" : MessageLookupByLibrary.simpleMessage("Valeur du système par défaut"), "systemDefault" : MessageLookupByLibrary.simpleMessage("Valeur du système par défaut"),
"timeLastPlayed" : m23, "timeLastPlayed" : m24,
"timeLeft" : m24, "timeLeft" : m25,
"to" : m25, "to" : m26,
"toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("Ajouté à la playlist."), "toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("Ajouté à la playlist."),
"toastDiscovery" : MessageLookupByLibrary.simpleMessage("Tutoriel réinitialisé, veuillez redémarrer l\'application."), "toastDiscovery" : MessageLookupByLibrary.simpleMessage("Tutoriel réinitialisé, veuillez redémarrer l\'application."),
"toastFileError" : MessageLookupByLibrary.simpleMessage("Erreur du fichier, échec de l\'abonnement."), "toastFileError" : MessageLookupByLibrary.simpleMessage("Erreur du fichier, échec de l\'abonnement."),
@ -306,8 +314,8 @@ class MessageLookup extends MessageLookupByLibrary {
"unlike" : MessageLookupByLibrary.simpleMessage("Dislike"), "unlike" : MessageLookupByLibrary.simpleMessage("Dislike"),
"unliked" : MessageLookupByLibrary.simpleMessage("L\'épisode a été supprimé des favoris."), "unliked" : MessageLookupByLibrary.simpleMessage("L\'épisode a été supprimé des favoris."),
"updateDate" : MessageLookupByLibrary.simpleMessage("Date de mise à jour"), "updateDate" : MessageLookupByLibrary.simpleMessage("Date de mise à jour"),
"updateEpisodesCount" : m26, "updateEpisodesCount" : m27,
"updateFailed" : MessageLookupByLibrary.simpleMessage("Échec de la mise à jour, erreur de réseau"), "updateFailed" : MessageLookupByLibrary.simpleMessage("Échec de la mise à jour, erreur de réseau"),
"version" : m27 "version" : m28
}; };
} }

View File

@ -63,17 +63,19 @@ class MessageLookup extends MessageLookupByLibrary {
static m21(date) => "${date}移除"; static m21(date) => "${date}移除";
static m22(count) => "${Intl.plural(count, zero: '刚刚', other: '${count}')}"; static m22(count) => "${Intl.plural(count, zero: '0 秒', other: '${count} 秒')}";
static m23(time) => "上次播放${time}"; static m23(count) => "${Intl.plural(count, zero: '刚刚', other: '${count}秒前')}";
static m24(time) => "剩余 ${time}"; static m24(time) => "上次播放${time}";
static m25(time) => "${time}"; static m25(time) => "剩余 ${time}";
static m26(count) => "${Intl.plural(count, zero: '未有更新', other: '更新 ${count} 集节目')}"; static m26(time) => "${time}";
static m27(version) => "版本:${version}"; static m27(count) => "${Intl.plural(count, zero: '未有更新', other: '更新 ${count} 集节目')}";
static m28(version) => "版本:${version}";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> { static _notInlinedMessages(_) => <String, Function> {
@ -187,6 +189,7 @@ class MessageLookup extends MessageLookupByLibrary {
"notificationUpdateError" : m18, "notificationUpdateError" : m18,
"oldestFirst" : MessageLookupByLibrary.simpleMessage("由旧到新"), "oldestFirst" : MessageLookupByLibrary.simpleMessage("由旧到新"),
"play" : MessageLookupByLibrary.simpleMessage("播放"), "play" : MessageLookupByLibrary.simpleMessage("播放"),
"playback" : MessageLookupByLibrary.simpleMessage("播放控制"),
"playing" : MessageLookupByLibrary.simpleMessage("正在播放"), "playing" : MessageLookupByLibrary.simpleMessage("正在播放"),
"plugins" : MessageLookupByLibrary.simpleMessage("插件"), "plugins" : MessageLookupByLibrary.simpleMessage("插件"),
"podcast" : m19, "podcast" : m19,
@ -214,7 +217,8 @@ class MessageLookup extends MessageLookupByLibrary {
"searchEpisode" : MessageLookupByLibrary.simpleMessage("搜索节目"), "searchEpisode" : MessageLookupByLibrary.simpleMessage("搜索节目"),
"searchInvalidRss" : MessageLookupByLibrary.simpleMessage("RSS 链接错误"), "searchInvalidRss" : MessageLookupByLibrary.simpleMessage("RSS 链接错误"),
"searchPodcast" : MessageLookupByLibrary.simpleMessage("搜索播客"), "searchPodcast" : MessageLookupByLibrary.simpleMessage("搜索播客"),
"secondsAgo" : m22, "secCount" : m22,
"secondsAgo" : m23,
"settingStorage" : MessageLookupByLibrary.simpleMessage("储存空间"), "settingStorage" : MessageLookupByLibrary.simpleMessage("储存空间"),
"settings" : MessageLookupByLibrary.simpleMessage("设置"), "settings" : MessageLookupByLibrary.simpleMessage("设置"),
"settingsAccentColor" : MessageLookupByLibrary.simpleMessage("次要颜色"), "settingsAccentColor" : MessageLookupByLibrary.simpleMessage("次要颜色"),
@ -238,6 +242,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("开启自动更新"), "settingsEnableSyncing" : MessageLookupByLibrary.simpleMessage("开启自动更新"),
"settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("在后台更新所有订阅播客"), "settingsEnableSyncingDes" : MessageLookupByLibrary.simpleMessage("在后台更新所有订阅播客"),
"settingsExportDes" : MessageLookupByLibrary.simpleMessage("导出及恢复所有设置项"), "settingsExportDes" : MessageLookupByLibrary.simpleMessage("导出及恢复所有设置项"),
"settingsFastForwardSec" : MessageLookupByLibrary.simpleMessage("快进时间"),
"settingsFastForwardSecDes" : MessageLookupByLibrary.simpleMessage("修改播放器快进时间"),
"settingsFeedback" : MessageLookupByLibrary.simpleMessage("反馈"), "settingsFeedback" : MessageLookupByLibrary.simpleMessage("反馈"),
"settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("意见与建议"), "settingsFeedbackDes" : MessageLookupByLibrary.simpleMessage("意见与建议"),
"settingsHistory" : MessageLookupByLibrary.simpleMessage("历史记录"), "settingsHistory" : MessageLookupByLibrary.simpleMessage("历史记录"),
@ -263,6 +269,8 @@ class MessageLookup extends MessageLookupByLibrary {
"settingsPrefrence" : MessageLookupByLibrary.simpleMessage("首选项"), "settingsPrefrence" : MessageLookupByLibrary.simpleMessage("首选项"),
"settingsRealDark" : MessageLookupByLibrary.simpleMessage("极黑"), "settingsRealDark" : MessageLookupByLibrary.simpleMessage("极黑"),
"settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("如果夜不够黑,请开启"), "settingsRealDarkDes" : MessageLookupByLibrary.simpleMessage("如果夜不够黑,请开启"),
"settingsRewindSec" : MessageLookupByLibrary.simpleMessage("快退时间"),
"settingsRewindSecDes" : MessageLookupByLibrary.simpleMessage("修改播放器快退时间"),
"settingsSTAuto" : MessageLookupByLibrary.simpleMessage("自动睡眠模式"), "settingsSTAuto" : MessageLookupByLibrary.simpleMessage("自动睡眠模式"),
"settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("定期开启睡眠模式"), "settingsSTAutoDes" : MessageLookupByLibrary.simpleMessage("定期开启睡眠模式"),
"settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("默认时长"), "settingsSTDefaultTime" : MessageLookupByLibrary.simpleMessage("默认时长"),
@ -283,9 +291,9 @@ class MessageLookup extends MessageLookupByLibrary {
"subscribe" : MessageLookupByLibrary.simpleMessage("订阅"), "subscribe" : MessageLookupByLibrary.simpleMessage("订阅"),
"subscribeExportDes" : MessageLookupByLibrary.simpleMessage("导出 OMPL 文件"), "subscribeExportDes" : MessageLookupByLibrary.simpleMessage("导出 OMPL 文件"),
"systemDefault" : MessageLookupByLibrary.simpleMessage("系统默认"), "systemDefault" : MessageLookupByLibrary.simpleMessage("系统默认"),
"timeLastPlayed" : m23, "timeLastPlayed" : m24,
"timeLeft" : m24, "timeLeft" : m25,
"to" : m25, "to" : m26,
"toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("添加到播放列表"), "toastAddPlaylist" : MessageLookupByLibrary.simpleMessage("添加到播放列表"),
"toastDiscovery" : MessageLookupByLibrary.simpleMessage("重启应用后可查看"), "toastDiscovery" : MessageLookupByLibrary.simpleMessage("重启应用后可查看"),
"toastFileError" : MessageLookupByLibrary.simpleMessage("文件错误,导入失败"), "toastFileError" : MessageLookupByLibrary.simpleMessage("文件错误,导入失败"),
@ -306,8 +314,8 @@ class MessageLookup extends MessageLookupByLibrary {
"unlike" : MessageLookupByLibrary.simpleMessage("取消喜欢"), "unlike" : MessageLookupByLibrary.simpleMessage("取消喜欢"),
"unliked" : MessageLookupByLibrary.simpleMessage("从收藏移除"), "unliked" : MessageLookupByLibrary.simpleMessage("从收藏移除"),
"updateDate" : MessageLookupByLibrary.simpleMessage("更新日期"), "updateDate" : MessageLookupByLibrary.simpleMessage("更新日期"),
"updateEpisodesCount" : m26, "updateEpisodesCount" : m27,
"updateFailed" : MessageLookupByLibrary.simpleMessage("更新失败"), "updateFailed" : MessageLookupByLibrary.simpleMessage("更新失败"),
"version" : m27 "version" : m28
}; };
} }

View File

@ -1163,6 +1163,16 @@ class S {
); );
} }
/// `Playback control`
String get playback {
return Intl.message(
'Playback control',
name: 'playback',
desc: '',
args: [],
);
}
/// `Playing` /// `Playing`
String get playing { String get playing {
return Intl.message( return Intl.message(
@ -1436,6 +1446,19 @@ class S {
); );
} }
/// `{count, plural, zero{0 sec} one{{count} sec} other{{count} sec}}`
String secCount(num count) {
return Intl.plural(
count,
zero: '0 sec',
one: '$count sec',
other: '$count sec',
name: 'secCount',
desc: '',
args: [count],
);
}
/// `{count, plural, zero{Just now} one{{count} second ago} other{{count} seconds ago}}` /// `{count, plural, zero{Just now} one{{count} second ago} other{{count} seconds ago}}`
String secondsAgo(num count) { String secondsAgo(num count) {
return Intl.plural( return Intl.plural(
@ -1669,6 +1692,26 @@ class S {
); );
} }
/// `Fast forward seconds`
String get settingsFastForwardSec {
return Intl.message(
'Fast forward seconds',
name: 'settingsFastForwardSec',
desc: '',
args: [],
);
}
/// `Change the fast forward seconds in player`
String get settingsFastForwardSecDes {
return Intl.message(
'Change the fast forward seconds in player',
name: 'settingsFastForwardSecDes',
desc: '',
args: [],
);
}
/// `Feedback` /// `Feedback`
String get settingsFeedback { String get settingsFeedback {
return Intl.message( return Intl.message(
@ -1919,6 +1962,26 @@ class S {
); );
} }
/// `Rewind seconds`
String get settingsRewindSec {
return Intl.message(
'Rewind seconds',
name: 'settingsRewindSec',
desc: '',
args: [],
);
}
/// `Change the rewind seconds in player`
String get settingsRewindSecDes {
return Intl.message(
'Change the rewind seconds in player',
name: 'settingsRewindSecDes',
desc: '',
args: [],
);
}
/// `Auto turn on sleep timer` /// `Auto turn on sleep timer`
String get settingsSTAuto { String get settingsSTAuto {
return Intl.message( return Intl.message(

View File

@ -18,8 +18,8 @@ import '../util/extension_helper.dart';
import '../util/custom_widget.dart'; import '../util/custom_widget.dart';
import '../util/custom_slider.dart'; import '../util/custom_slider.dart';
import '../episodes/episode_detail.dart'; import '../episodes/episode_detail.dart';
import 'playlist.dart';
import '../util/audiopanel.dart'; import '../util/audiopanel.dart';
import 'playlist.dart';
final List<BoxShadow> _customShadow = [ final List<BoxShadow> _customShadow = [
BoxShadow(blurRadius: 26, offset: Offset(-6, -6), color: Colors.white), BoxShadow(blurRadius: 26, offset: Offset(-6, -6), color: Colors.white),
@ -1274,11 +1274,10 @@ class _ControlPanelState extends State<ControlPanel>
children: [ children: [
IconButton( IconButton(
padding: EdgeInsets.symmetric(horizontal: 25.0), padding: EdgeInsets.symmetric(horizontal: 25.0),
onPressed: playing onPressed:
? () => audio.forwardAudio(-10) playing ? () => audio.rewind() : null,
: null,
iconSize: 32.0, iconSize: 32.0,
icon: Icon(Icons.replay_10), icon: Icon(Icons.replay),
color: Colors.grey[500]), color: Colors.grey[500]),
Container( Container(
margin: EdgeInsets.symmetric(horizontal: 30), margin: EdgeInsets.symmetric(horizontal: 30),
@ -1343,11 +1342,10 @@ class _ControlPanelState extends State<ControlPanel>
), ),
IconButton( IconButton(
padding: EdgeInsets.symmetric(horizontal: 25.0), padding: EdgeInsets.symmetric(horizontal: 25.0),
onPressed: playing onPressed:
? () => audio.forwardAudio(30) playing ? () => audio.fastForward() : null,
: null,
iconSize: 32.0, iconSize: 32.0,
icon: Icon(Icons.forward_30), icon: Icon(Icons.forward),
color: Colors.grey[500]), color: Colors.grey[500]),
], ],
), ),

View File

@ -272,6 +272,8 @@
"@oldestFirst": {}, "@oldestFirst": {},
"play": "Play", "play": "Play",
"@play": {}, "@play": {},
"playback": "Playback control",
"@playback": {},
"playing": "Playing", "playing": "Playing",
"@playing": {}, "@playing": {},
"plugins": "Plugins", "plugins": "Plugins",
@ -343,6 +345,8 @@
"@searchInvalidRss": {}, "@searchInvalidRss": {},
"searchPodcast": "Search podcast", "searchPodcast": "Search podcast",
"@searchPodcast": {}, "@searchPodcast": {},
"secCount": "{count, plural, zero{0 sec} one{{count} sec} other{{count} sec}}",
"@secCount": {},
"secondsAgo": "{count, plural, zero{Just now} one{{count} second ago} other{{count} seconds ago}}", "secondsAgo": "{count, plural, zero{Just now} one{{count} second ago} other{{count} seconds ago}}",
"@secondsAgo": {}, "@secondsAgo": {},
"settings": "Settings", "settings": "Settings",
@ -391,6 +395,10 @@
"@settingsEnableSyncingDes": {}, "@settingsEnableSyncingDes": {},
"settingsExportDes": "Export and import app settings", "settingsExportDes": "Export and import app settings",
"@settingsExportDes": {}, "@settingsExportDes": {},
"settingsFastForwardSec": "Fast forward seconds",
"@settingsFastForwardSec": {},
"settingsFastForwardSecDes": "Change the fast forward seconds in player",
"@settingsFastForwardSecDes": {},
"settingsFeedback": "Feedback", "settingsFeedback": "Feedback",
"@settingsFeedback": {}, "@settingsFeedback": {},
"settingsFeedbackDes": "Bugs and features request", "settingsFeedbackDes": "Bugs and features request",
@ -441,6 +449,10 @@
"@settingsRealDark": {}, "@settingsRealDark": {},
"settingsRealDarkDes": "Turn on if you think the night is not dark enough", "settingsRealDarkDes": "Turn on if you think the night is not dark enough",
"@settingsRealDarkDes": {}, "@settingsRealDarkDes": {},
"settingsRewindSec": "Rewind seconds",
"@settingsRewindSec": {},
"settingsRewindSecDes": "Change the rewind seconds in player",
"@settingsRewindSecDes": {},
"settingsSTAuto": "Auto turn on sleep timer", "settingsSTAuto": "Auto turn on sleep timer",
"@settingsSTAuto": {}, "@settingsSTAuto": {},
"settingsSTAutoDes": "Auto start sleep timer at scheduled time", "settingsSTAutoDes": "Auto start sleep timer at scheduled time",

View File

@ -272,6 +272,8 @@
"@oldestFirst": {}, "@oldestFirst": {},
"play": "Lecture", "play": "Lecture",
"@play": {}, "@play": {},
"playback": "Playback control",
"@playback": {},
"playing": "En cours", "playing": "En cours",
"@playing": {}, "@playing": {},
"plugins": "Plugins", "plugins": "Plugins",
@ -343,6 +345,8 @@
"@searchInvalidRss": {}, "@searchInvalidRss": {},
"searchPodcast": "Chercher un podcast", "searchPodcast": "Chercher un podcast",
"@searchPodcast": {}, "@searchPodcast": {},
"secCount": "{count, plural, zero{0 sec} one{{count} sec} other{{count} sec}}",
"@secCount": {},
"secondsAgo": "{count, plural, zero{A l'instant} one{Il y a {count} seconde} other{Il y a {count} secondes}}", "secondsAgo": "{count, plural, zero{A l'instant} one{Il y a {count} seconde} other{Il y a {count} secondes}}",
"@secondsAgo": {}, "@secondsAgo": {},
"settings": "Paramètres", "settings": "Paramètres",
@ -391,6 +395,10 @@
"@settingsEnableSyncingDes": {}, "@settingsEnableSyncingDes": {},
"settingsExportDes": "Exporter et importer les paramètres de l'application", "settingsExportDes": "Exporter et importer les paramètres de l'application",
"@settingsExportDes": {}, "@settingsExportDes": {},
"settingsFastForwardSec": "Fast forward seconds",
"@settingsFastForwardSec": {},
"settingsFastForwardSecDes": "Change the fast forward seconds in player",
"@settingsFastForwardSecDes": {},
"settingsFeedback": "Feedback", "settingsFeedback": "Feedback",
"@settingsFeedback": {}, "@settingsFeedback": {},
"settingsFeedbackDes": "Report de bugs et demande d'ajout de fonction", "settingsFeedbackDes": "Report de bugs et demande d'ajout de fonction",
@ -441,6 +449,10 @@
"@settingsRealDark": {}, "@settingsRealDark": {},
"settingsRealDarkDes": "Activez pour un mode sombre accentué", "settingsRealDarkDes": "Activez pour un mode sombre accentué",
"@settingsRealDarkDes": {}, "@settingsRealDarkDes": {},
"settingsRewindSec": "Rewind seconds",
"@settingsRewindSec": {},
"settingsRewindSecDes": "Change the rewind seconds in player",
"@settingsRewindSecDes": {},
"settingsSTAuto": "Activation automatique de la minuterie", "settingsSTAuto": "Activation automatique de la minuterie",
"@settingsSTAuto": {}, "@settingsSTAuto": {},
"settingsSTAutoDes": "Démarrer la minuterie à l'horaire programmé", "settingsSTAutoDes": "Démarrer la minuterie à l'horaire programmé",

View File

@ -272,6 +272,8 @@
"@oldestFirst": {}, "@oldestFirst": {},
"play": "播放", "play": "播放",
"@play": {}, "@play": {},
"playback": "播放控制",
"@playback": {},
"playing": "正在播放", "playing": "正在播放",
"@playing": {}, "@playing": {},
"plugins": "插件", "plugins": "插件",
@ -343,6 +345,8 @@
"@searchInvalidRss": {}, "@searchInvalidRss": {},
"searchPodcast": "搜索播客", "searchPodcast": "搜索播客",
"@searchPodcast": {}, "@searchPodcast": {},
"secCount": "{count, plural, zero{0 秒} other{{count} 秒}}",
"@secCount": {},
"secondsAgo": "{count, plural, zero{刚刚} other{{count}秒前}}", "secondsAgo": "{count, plural, zero{刚刚} other{{count}秒前}}",
"@secondsAgo": {}, "@secondsAgo": {},
"settings": "设置", "settings": "设置",
@ -391,6 +395,10 @@
"@settingsEnableSyncingDes": {}, "@settingsEnableSyncingDes": {},
"settingsExportDes": "导出及恢复所有设置项", "settingsExportDes": "导出及恢复所有设置项",
"@settingsExportDes": {}, "@settingsExportDes": {},
"settingsFastForwardSec": "快进时间",
"@settingsFastForwardSec": {},
"settingsFastForwardSecDes": "修改播放器快进时间",
"@settingsFastForwardSecDes": {},
"settingsFeedback": "反馈", "settingsFeedback": "反馈",
"@settingsFeedback": {}, "@settingsFeedback": {},
"settingsFeedbackDes": "意见与建议", "settingsFeedbackDes": "意见与建议",
@ -441,6 +449,10 @@
"@settingsRealDark": {}, "@settingsRealDark": {},
"settingsRealDarkDes": "如果夜不够黑,请开启", "settingsRealDarkDes": "如果夜不够黑,请开启",
"@settingsRealDarkDes": {}, "@settingsRealDarkDes": {},
"settingsRewindSec": "快退时间",
"@settingsRewindSec": {},
"settingsRewindSecDes": "修改播放器快退时间",
"@settingsRewindSecDes": {},
"settingsSTAuto": "自动睡眠模式", "settingsSTAuto": "自动睡眠模式",
"@settingsSTAuto": {}, "@settingsSTAuto": {},
"settingsSTAutoDes": "定期开启睡眠模式", "settingsSTAutoDes": "定期开启睡眠模式",

View File

@ -14,10 +14,7 @@ import '../util/general_dialog.dart';
import '../util/extension_helper.dart'; import '../util/extension_helper.dart';
import '../util/custom_dropdown.dart'; import '../util/custom_dropdown.dart';
String stringForMins(int mins) { const List secondsToSelect = [10, 15, 20, 25, 30, 45, 60];
if (mins == null) return null;
return '${(mins ~/ 60)}:${(mins.truncate() % 60).toString().padLeft(2, '0')}';
}
class PlaySetting extends StatelessWidget { class PlaySetting extends StatelessWidget {
Widget _modeWidget(BuildContext context) { Widget _modeWidget(BuildContext context) {
@ -158,7 +155,7 @@ class PlaySetting extends StatelessWidget {
topLeft: Radius.circular(5)), topLeft: Radius.circular(5)),
), ),
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text(s.from(stringForMins(data.item1))), child: Text(s.from(data.item1.toTime)),
), ),
), ),
), ),
@ -224,7 +221,7 @@ class PlaySetting extends StatelessWidget {
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
bottomRight: Radius.circular(5), bottomRight: Radius.circular(5),
topRight: Radius.circular(5))), topRight: Radius.circular(5))),
child: Text(s.to(stringForMins(data.item2)), child: Text(s.to(data.item2.toTime),
style: TextStyle(color: Colors.white)), style: TextStyle(color: Colors.white)),
), ),
), ),
@ -302,6 +299,73 @@ class PlaySetting extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.all(10.0), padding: const EdgeInsets.all(10.0),
), ),
Container(
height: 30.0,
padding: EdgeInsets.symmetric(horizontal: 70),
alignment: Alignment.centerLeft,
child: Text(s.playback,
style: Theme.of(context)
.textTheme
.bodyText1
.copyWith(color: Theme.of(context).accentColor)),
),
ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: <Widget>[
ListTile(
contentPadding: EdgeInsets.only(
left: 80.0, right: 20, bottom: 10, top: 10),
title: Text(s.settingsFastForwardSec),
subtitle: Text(s.settingsFastForwardSecDes),
trailing: Selector<SettingState, int>(
selector: (_, settings) =>
settings.fastForwardSeconds,
builder: (_, data, __) => MyDropdownButton(
hint: Text(s.secCount(data)),
underline: Center(),
elevation: 1,
displayItemCount: 5,
isDense: true,
value: data,
onChanged: (int value) =>
settings.setFastForwardSeconds = value,
items: secondsToSelect
.map<DropdownMenuItem<int>>((e) {
return DropdownMenuItem<int>(
value: e, child: Text(s.secCount(e)));
}).toList()),
),
),
ListTile(
contentPadding: EdgeInsets.only(
left: 80.0, right: 20, bottom: 10, top: 10),
title: Text(s.settingsRewindSec),
subtitle: Text(s.settingsRewindSecDes),
trailing: Selector<SettingState, int>(
selector: (_, settings) => settings.rewindSeconds,
builder: (_, data, __) => MyDropdownButton(
hint: Text(s.secCount(data)),
underline: Center(),
elevation: 1,
displayItemCount: 5,
isDense: true,
value: data,
onChanged: (int value) =>
settings.setRewindSeconds = value,
items: secondsToSelect
.map<DropdownMenuItem<int>>((e) {
return DropdownMenuItem<int>(
value: e, child: Text(s.secCount(e)));
}).toList()),
),
),
Divider(),
]),
Padding(
padding: const EdgeInsets.all(10.0),
),
Container( Container(
height: 30.0, height: 30.0,
padding: EdgeInsets.symmetric(horizontal: 70), padding: EdgeInsets.symmetric(horizontal: 70),
@ -337,6 +401,7 @@ class PlaySetting extends StatelessWidget {
}).toList()), }).toList()),
), ),
), ),
Divider(),
Selector<SettingState, bool>( Selector<SettingState, bool>(
selector: (_, settings) => settings.autoSleepTimer, selector: (_, settings) => settings.autoSleepTimer,
builder: (_, data, __) => ListTile( builder: (_, data, __) => ListTile(
@ -376,6 +441,7 @@ class PlaySetting extends StatelessWidget {
Divider(height: 2) Divider(height: 2)
], ],
), ),
SizedBox(height: 20)
], ],
), ),
], ],

View File

@ -36,9 +36,9 @@ MediaControl stopControl = MediaControl(
label: 'Stop', label: 'Stop',
action: MediaAction.stop, action: MediaAction.stop,
); );
MediaControl forward30 = MediaControl( MediaControl forward = MediaControl(
androidIcon: 'drawable/ic_stat_forward_30', androidIcon: 'drawable/baseline_fast_forward_white_24',
label: 'forward30', label: 'forward',
action: MediaAction.fastForward, action: MediaAction.fastForward,
); );
@ -530,6 +530,14 @@ class AudioPlayerNotifier extends ChangeNotifier {
AudioService.seekTo(Duration(milliseconds: pos)); AudioService.seekTo(Duration(milliseconds: pos));
} }
fastForward() async {
await AudioService.fastForward();
}
rewind() async {
await AudioService.rewind();
}
seekTo(int position) async { seekTo(int position) async {
if (_audioState != AudioProcessingState.connecting && if (_audioState != AudioProcessingState.connecting &&
_audioState != AudioProcessingState.none) _audioState != AudioProcessingState.none)
@ -848,7 +856,7 @@ class AudioPlayerTask extends BackgroundAudioTask {
@override @override
void onRewind() { void onRewind() {
_seekRelative(rewindInterval); _seekRelative(-rewindInterval);
} }
@override @override
@ -930,9 +938,9 @@ class AudioPlayerTask extends BackgroundAudioTask {
List<MediaControl> getControls() { List<MediaControl> getControls() {
if (_playing) { if (_playing) {
return [pauseControl, forward30, skipToNextControl, stopControl]; return [pauseControl, forward, skipToNextControl, stopControl];
} else { } else {
return [playControl, forward30, skipToNextControl, stopControl]; return [playControl, forward, skipToNextControl, stopControl];
} }
} }
} }

View File

@ -77,33 +77,29 @@ ThemeData lightTheme = ThemeData(
); );
class SettingState extends ChangeNotifier { class SettingState extends ChangeNotifier {
KeyValueStorage themeStorage = KeyValueStorage(themesKey); var themeStorage = KeyValueStorage(themesKey);
KeyValueStorage accentStorage = KeyValueStorage(accentsKey); var accentStorage = KeyValueStorage(accentsKey);
KeyValueStorage autoupdateStorage = KeyValueStorage(autoUpdateKey); var autoupdateStorage = KeyValueStorage(autoUpdateKey);
KeyValueStorage intervalStorage = KeyValueStorage(updateIntervalKey); var intervalStorage = KeyValueStorage(updateIntervalKey);
KeyValueStorage downloadUsingDataStorage = var downloadUsingDataStorage = KeyValueStorage(downloadUsingDataKey);
KeyValueStorage(downloadUsingDataKey); var introStorage = KeyValueStorage(introKey);
KeyValueStorage introStorage = KeyValueStorage(introKey); var realDarkStorage = KeyValueStorage(realDarkKey);
KeyValueStorage realDarkStorage = KeyValueStorage(realDarkKey); var autoPlayStorage = KeyValueStorage(autoPlayKey);
KeyValueStorage autoPlayStorage = KeyValueStorage(autoPlayKey); var defaultSleepTimerStorage = KeyValueStorage(defaultSleepTimerKey);
KeyValueStorage defaultSleepTimerStorage = var autoSleepTimerStorage = KeyValueStorage(autoSleepTimerKey);
KeyValueStorage(defaultSleepTimerKey); var autoSleepTimerModeStorage = KeyValueStorage(autoSleepTimerModeKey);
KeyValueStorage autoSleepTimerStorage = KeyValueStorage(autoSleepTimerKey); var autoSleepTimerStartStorage = KeyValueStorage(autoSleepTimerStartKey);
KeyValueStorage autoSleepTimerModeStorage = var autoSleepTimerEndStorage = KeyValueStorage(autoSleepTimerEndKey);
KeyValueStorage(autoSleepTimerModeKey); var tapToOpenPopupMenuStorage = KeyValueStorage(tapToOpenPopupMenuKey);
KeyValueStorage autoSleepTimerStartStorage = var cacheStorage = KeyValueStorage(cacheMaxKey);
KeyValueStorage(autoSleepTimerStartKey); var podcastLayoutStorage = KeyValueStorage(podcastLayoutKey);
KeyValueStorage autoSleepTimerEndStorage = var favLayoutStorage = KeyValueStorage(favLayoutKey);
KeyValueStorage(autoSleepTimerEndKey); var downloadLayoutStorage = KeyValueStorage(downloadLayoutKey);
KeyValueStorage tapToOpenPopupMenuStorage = var recentLayoutStorage = KeyValueStorage(recentLayoutKey);
KeyValueStorage(tapToOpenPopupMenuKey); var autoDeleteStorage = KeyValueStorage(autoDeleteKey);
KeyValueStorage cacheStorage = KeyValueStorage(cacheMaxKey); var autoDownloadStorage = KeyValueStorage(autoDownloadNetworkKey);
KeyValueStorage podcastLayoutStorage = KeyValueStorage(podcastLayoutKey); var fastForwardSecondsStorage = KeyValueStorage(fastForwardSecondsKey);
KeyValueStorage favLayoutStorage = KeyValueStorage(favLayoutKey); var rewindSecondsStorage = KeyValueStorage(rewindSecondsKey);
KeyValueStorage downloadLayoutStorage = KeyValueStorage(downloadLayoutKey);
KeyValueStorage recentLayoutStorage = KeyValueStorage(recentLayoutKey);
KeyValueStorage autoDeleteStorage = KeyValueStorage(autoDeleteKey);
KeyValueStorage autoDownloadStorage = KeyValueStorage(autoDownloadNetworkKey);
Future initData() async { Future initData() async {
await _getTheme(); await _getTheme();
@ -238,17 +234,35 @@ class SettingState extends ChangeNotifier {
_saveAutoSleepTimerEnd(); _saveAutoSleepTimerEnd();
} }
int _fastForwardSeconds;
int get fastForwardSeconds => _fastForwardSeconds;
set setFastForwardSeconds(int sec) {
_fastForwardSeconds = sec;
notifyListeners();
_saveFastForwardSeconds();
}
int _rewindSeconds;
int get rewindSeconds => _rewindSeconds;
set setRewindSeconds(int sec) {
_rewindSeconds = sec;
notifyListeners();
_saveRewindSeconds();
}
@override @override
void addListener(VoidCallback listener) { void addListener(VoidCallback listener) {
super.addListener(listener); super.addListener(listener);
_getAutoUpdate(); _getAutoUpdate();
_getDownloadUsingData(); _getDownloadUsingData();
_getSleepTimerData(); _getSleepTimerData();
_getPlayerSeconds();
_getUpdateInterval().then((value) async { _getUpdateInterval().then((value) async {
if (_initUpdateTag == 0) if (_initUpdateTag == 0)
setWorkManager(24); setWorkManager(24);
//Restart worker if anythin changed in worker callback.
//varsion 2 add auto download new episodes /// Restart worker if anythin changed in worker callback.
/// varsion 2 add auto download new episodes
else if (_autoUpdate && _initialShowIntor == 1) { else if (_autoUpdate && _initialShowIntor == 1) {
await cancelWork(); await cancelWork();
setWorkManager(_initUpdateTag); setWorkManager(_initUpdateTag);
@ -314,6 +328,12 @@ class SettingState extends ChangeNotifier {
_autoSleepTimerMode = await autoSleepTimerModeStorage.getInt(); _autoSleepTimerMode = await autoSleepTimerModeStorage.getInt();
} }
Future _getPlayerSeconds() async {
_rewindSeconds = await rewindSecondsStorage.getInt(defaultValue: 10);
_fastForwardSeconds =
await fastForwardSecondsStorage.getInt(defaultValue: 30);
}
Future _saveAccentSetColor() async { Future _saveAccentSetColor() async {
await accentStorage await accentStorage
.saveString(_accentSetColor.toString().substring(10, 16)); .saveString(_accentSetColor.toString().substring(10, 16));
@ -363,6 +383,14 @@ class SettingState extends ChangeNotifier {
await autoSleepTimerEndStorage.saveInt(_autoSleepTimerEnd); await autoSleepTimerEndStorage.saveInt(_autoSleepTimerEnd);
} }
Future _saveFastForwardSeconds() async {
await fastForwardSecondsStorage.saveInt(_fastForwardSeconds);
}
Future _saveRewindSeconds() async {
await rewindSecondsStorage.saveInt(_rewindSeconds);
}
Future<SettingsBackup> backup() async { Future<SettingsBackup> backup() async {
int theme = await themeStorage.getInt(); int theme = await themeStorage.getInt();
String accentColor = await accentStorage.getString(); String accentColor = await accentStorage.getString();
@ -392,6 +420,9 @@ class SettingState extends ChangeNotifier {
int defaultSleepTime = await defaultSleepTimerStorage.getInt(); int defaultSleepTime = await defaultSleepTimerStorage.getInt();
bool tapToOpenPopupMenu = await KeyValueStorage(tapToOpenPopupMenuKey) bool tapToOpenPopupMenu = await KeyValueStorage(tapToOpenPopupMenuKey)
.getBool(defaultValue: false); .getBool(defaultValue: false);
int fastForwardSeconds =
await fastForwardSecondsStorage.getInt(defaultValue: 30);
int rewindSeconds = await rewindSecondsStorage.getInt(defaultValue: 10);
return SettingsBackup( return SettingsBackup(
theme: theme, theme: theme,
@ -414,7 +445,9 @@ class SettingState extends ChangeNotifier {
autoSleepTimerEnd: autoSleepTimerEnd, autoSleepTimerEnd: autoSleepTimerEnd,
autoSleepTimerMode: autoSleepTimerMode, autoSleepTimerMode: autoSleepTimerMode,
defaultSleepTime: defaultSleepTime, defaultSleepTime: defaultSleepTime,
tapToOpenPopupMenu: tapToOpenPopupMenu); tapToOpenPopupMenu: tapToOpenPopupMenu,
fastForwardSeconds: fastForwardSeconds,
rewindSeconds: rewindSeconds);
} }
Future<void> restore(SettingsBackup backup) async { Future<void> restore(SettingsBackup backup) async {
@ -440,6 +473,8 @@ class SettingState extends ChangeNotifier {
await autoSleepTimerEndStorage.saveInt(backup.autoSleepTimerEnd); await autoSleepTimerEndStorage.saveInt(backup.autoSleepTimerEnd);
await autoSleepTimerModeStorage.saveInt(backup.autoSleepTimerMode); await autoSleepTimerModeStorage.saveInt(backup.autoSleepTimerMode);
await defaultSleepTimerStorage.saveInt(backup.defaultSleepTime); await defaultSleepTimerStorage.saveInt(backup.defaultSleepTime);
await fastForwardSecondsStorage.saveInt(backup.fastForwardSeconds);
await rewindSecondsStorage.saveInt(backup.rewindSeconds);
await KeyValueStorage(tapToOpenPopupMenuKey) await KeyValueStorage(tapToOpenPopupMenuKey)
.saveBool(backup.tapToOpenPopupMenu); .saveBool(backup.tapToOpenPopupMenu);
await initData(); await initData();

View File

@ -20,6 +20,8 @@ class SettingsBackup {
final int defaultSleepTime; final int defaultSleepTime;
final int autoSleepTimerMode; final int autoSleepTimerMode;
final bool tapToOpenPopupMenu; final bool tapToOpenPopupMenu;
final int fastForwardSeconds;
final int rewindSeconds;
SettingsBackup( SettingsBackup(
{this.theme, {this.theme,
this.accentColor, this.accentColor,
@ -41,7 +43,9 @@ class SettingsBackup {
this.autoSleepTimerEnd, this.autoSleepTimerEnd,
this.defaultSleepTime, this.defaultSleepTime,
this.autoSleepTimerMode, this.autoSleepTimerMode,
this.tapToOpenPopupMenu}); this.tapToOpenPopupMenu,
this.fastForwardSeconds,
this.rewindSeconds});
Map<String, Object> toJson() { Map<String, Object> toJson() {
return { return {
@ -64,7 +68,9 @@ class SettingsBackup {
'autoSleepTimerStart': autoSleepTimerStart, 'autoSleepTimerStart': autoSleepTimerStart,
'autoSleepTimerEnd': autoSleepTimerEnd, 'autoSleepTimerEnd': autoSleepTimerEnd,
'autoSleepTimerMode': autoSleepTimerMode, 'autoSleepTimerMode': autoSleepTimerMode,
'tapToOpenPopupMenu': tapToOpenPopupMenu 'tapToOpenPopupMenu': tapToOpenPopupMenu,
'fastForwardSeconds': fastForwardSeconds,
'rewindSeconds': rewindSeconds
}; };
} }
@ -90,6 +96,8 @@ class SettingsBackup {
autoSleepTimerStart: json['autoSleepeTimerStart'] as int, autoSleepTimerStart: json['autoSleepeTimerStart'] as int,
autoSleepTimerEnd: json['autoSleepTimerEnd'] as int, autoSleepTimerEnd: json['autoSleepTimerEnd'] as int,
autoSleepTimerMode: json['autoSleepTimerMode'] as int, autoSleepTimerMode: json['autoSleepTimerMode'] as int,
tapToOpenPopupMenu: json['tapToOpenPopupMenu'] as bool); tapToOpenPopupMenu: json['tapToOpenPopupMenu'] as bool,
fastForwardSeconds: json['fastForwardSeconds'] as int,
rewindSeconds: json['rewindSeconds'] as int);
} }
} }