feat(tv): add actions bottom sheet for non-live schedule items

This commit is contained in:
edde746
2026-02-12 18:09:43 +01:00
parent ca90600764
commit 88aca7aad3
20 changed files with 62 additions and 22 deletions
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Tagsüber",
"evening": "Abend",
"lateNight": "Spätnacht",
"whatsOn": "Jetzt im TV"
"whatsOn": "Jetzt im TV",
"watchChannel": "Kanal ansehen"
},
"downloads": {
"title": "Downloads",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Daytime",
"evening": "Evening",
"lateNight": "Late Night",
"whatsOn": "What's On"
"whatsOn": "What's On",
"watchChannel": "Watch Channel"
},
"collections": {
"title": "Collections",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Día",
"evening": "Noche",
"lateNight": "Trasnoche",
"whatsOn": "En emisión"
"whatsOn": "En emisión",
"watchChannel": "Ver canal"
},
"collections": {
"title": "Colecciones",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Journée",
"evening": "Soirée",
"lateNight": "Nuit tardive",
"whatsOn": "En ce moment"
"whatsOn": "En ce moment",
"watchChannel": "Regarder la chaîne"
},
"collections": {
"title": "Collections",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Giorno",
"evening": "Sera",
"lateNight": "Notte tarda",
"whatsOn": "In onda ora"
"whatsOn": "In onda ora",
"watchChannel": "Guarda canale"
},
"downloads": {
"title": "Download",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "낮",
"evening": "저녁",
"lateNight": "심야 방송",
"whatsOn": "지금 방송 중"
"whatsOn": "지금 방송 중",
"watchChannel": "채널 시청"
},
"collections": {
"title": "컬렉션",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Overdag",
"evening": "Avond",
"lateNight": "Late avond",
"whatsOn": "Nu op TV"
"whatsOn": "Nu op TV",
"watchChannel": "Kanaal bekijken"
},
"downloads": {
"title": "Downloads",
+2 -2
View File
@@ -4,9 +4,9 @@
/// To regenerate, run: `dart run slang`
///
/// Locales: 9
/// Strings: 6552 (728 per locale)
/// Strings: 6561 (729 per locale)
///
/// Built on 2026-02-12 at 14:47 UTC
/// Built on 2026-02-12 at 17:06 UTC
// coverage:ignore-file
// ignore_for_file: type=lint, unused_import
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvDe implements TranslationsLiveTvEn {
@override String get evening => 'Abend';
@override String get lateNight => 'Spätnacht';
@override String get whatsOn => 'Jetzt im TV';
@override String get watchChannel => 'Kanal ansehen';
}
// Path: downloads
@@ -1718,6 +1719,7 @@ extension on TranslationsDe {
'liveTv.evening' => 'Abend',
'liveTv.lateNight' => 'Spätnacht',
'liveTv.whatsOn' => 'Jetzt im TV',
'liveTv.watchChannel' => 'Kanal ansehen',
'downloads.title' => 'Downloads',
'downloads.manage' => 'Verwalten',
'downloads.tvShows' => 'Serien',
@@ -1726,9 +1728,9 @@ extension on TranslationsDe {
'downloads.noDownloadsDescription' => 'Heruntergeladene Inhalte werden hier für die Offline-Wiedergabe angezeigt',
'downloads.downloadNow' => 'Herunterladen',
'downloads.deleteDownload' => 'Download löschen',
'downloads.retryDownload' => 'Download wiederholen',
_ => null,
} ?? switch (path) {
'downloads.retryDownload' => 'Download wiederholen',
'downloads.downloadQueued' => 'Download in Warteschlange',
'downloads.episodesQueued' => ({required Object count}) => '${count} Episoden zum Download hinzugefügt',
'downloads.downloadDeleted' => 'Download gelöscht',
+5 -1
View File
@@ -1752,6 +1752,9 @@ class TranslationsLiveTvEn {
/// en: 'What's On'
String get whatsOn => 'What\'s On';
/// en: 'Watch Channel'
String get watchChannel => 'Watch Channel';
}
// Path: collections
@@ -3181,6 +3184,7 @@ extension on Translations {
'liveTv.evening' => 'Evening',
'liveTv.lateNight' => 'Late Night',
'liveTv.whatsOn' => 'What\'s On',
'liveTv.watchChannel' => 'Watch Channel',
'collections.title' => 'Collections',
'collections.collection' => 'Collection',
'collections.empty' => 'Collection is empty',
@@ -3189,9 +3193,9 @@ extension on Translations {
'collections.deleteConfirm' => ({required Object title}) => 'Are you sure you want to delete "${title}"? This action cannot be undone.',
'collections.deleted' => 'Collection deleted',
'collections.deleteFailed' => 'Failed to delete collection',
'collections.deleteFailedWithError' => ({required Object error}) => 'Failed to delete collection: ${error}',
_ => null,
} ?? switch (path) {
'collections.deleteFailedWithError' => ({required Object error}) => 'Failed to delete collection: ${error}',
'collections.failedToLoadItems' => ({required Object error}) => 'Failed to load collection items: ${error}',
'collections.selectCollection' => 'Select Collection',
'collections.createNewCollection' => 'Create New Collection',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvEs implements TranslationsLiveTvEn {
@override String get evening => 'Noche';
@override String get lateNight => 'Trasnoche';
@override String get whatsOn => 'En emisión';
@override String get watchChannel => 'Ver canal';
}
// Path: collections
@@ -1718,6 +1719,7 @@ extension on TranslationsEs {
'liveTv.evening' => 'Noche',
'liveTv.lateNight' => 'Trasnoche',
'liveTv.whatsOn' => 'En emisión',
'liveTv.watchChannel' => 'Ver canal',
'collections.title' => 'Colecciones',
'collections.collection' => 'Colección',
'collections.empty' => 'La colección está vacía',
@@ -1726,9 +1728,9 @@ extension on TranslationsEs {
'collections.deleteConfirm' => ({required Object title}) => '¿Estás seguro de que quieres eliminar "${title}"? Esta acción no se puede deshacer.',
'collections.deleted' => 'Colección eliminada',
'collections.deleteFailed' => 'Error al eliminar la colección',
'collections.deleteFailedWithError' => ({required Object error}) => 'Error al eliminar la colección: ${error}',
_ => null,
} ?? switch (path) {
'collections.deleteFailedWithError' => ({required Object error}) => 'Error al eliminar la colección: ${error}',
'collections.failedToLoadItems' => ({required Object error}) => 'Error al cargar los elementos de la colección: ${error}',
'collections.selectCollection' => 'Seleccionar Colección',
'collections.createNewCollection' => 'Crear Nueva Colección',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvFr implements TranslationsLiveTvEn {
@override String get evening => 'Soirée';
@override String get lateNight => 'Nuit tardive';
@override String get whatsOn => 'En ce moment';
@override String get watchChannel => 'Regarder la chaîne';
}
// Path: collections
@@ -1718,6 +1719,7 @@ extension on TranslationsFr {
'liveTv.evening' => 'Soirée',
'liveTv.lateNight' => 'Nuit tardive',
'liveTv.whatsOn' => 'En ce moment',
'liveTv.watchChannel' => 'Regarder la chaîne',
'collections.title' => 'Collections',
'collections.collection' => 'Collection',
'collections.empty' => 'La collection est vide',
@@ -1726,9 +1728,9 @@ extension on TranslationsFr {
'collections.deleteConfirm' => ({required Object title}) => 'Êtes-vous sûr de vouloir supprimer "${title}" ? Cette action ne peut pas être annulée.',
'collections.deleted' => 'Collection supprimée',
'collections.deleteFailed' => 'Échec de la suppression de la collection',
'collections.deleteFailedWithError' => ({required Object error}) => 'Échec de la suppression de la collection: ${error}',
_ => null,
} ?? switch (path) {
'collections.deleteFailedWithError' => ({required Object error}) => 'Échec de la suppression de la collection: ${error}',
'collections.failedToLoadItems' => ({required Object error}) => 'Échec du chargement des éléments de la collection: ${error}',
'collections.selectCollection' => 'Sélectionner une collection',
'collections.createNewCollection' => 'Créer une nouvelle collection',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvIt implements TranslationsLiveTvEn {
@override String get evening => 'Sera';
@override String get lateNight => 'Notte tarda';
@override String get whatsOn => 'In onda ora';
@override String get watchChannel => 'Guarda canale';
}
// Path: downloads
@@ -1718,6 +1719,7 @@ extension on TranslationsIt {
'liveTv.evening' => 'Sera',
'liveTv.lateNight' => 'Notte tarda',
'liveTv.whatsOn' => 'In onda ora',
'liveTv.watchChannel' => 'Guarda canale',
'downloads.title' => 'Download',
'downloads.manage' => 'Gestisci',
'downloads.tvShows' => 'Serie TV',
@@ -1726,9 +1728,9 @@ extension on TranslationsIt {
'downloads.noDownloadsDescription' => 'I contenuti scaricati appariranno qui per la visualizzazione offline',
'downloads.downloadNow' => 'Scarica',
'downloads.deleteDownload' => 'Elimina download',
'downloads.retryDownload' => 'Riprova download',
_ => null,
} ?? switch (path) {
'downloads.retryDownload' => 'Riprova download',
'downloads.downloadQueued' => 'Download in coda',
'downloads.episodesQueued' => ({required Object count}) => '${count} episodi in coda per il download',
'downloads.downloadDeleted' => 'Download eliminato',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvKo implements TranslationsLiveTvEn {
@override String get evening => '저녁';
@override String get lateNight => '심야 방송';
@override String get whatsOn => '지금 방송 중';
@override String get watchChannel => '채널 시청';
}
// Path: collections
@@ -1718,6 +1719,7 @@ extension on TranslationsKo {
'liveTv.evening' => '저녁',
'liveTv.lateNight' => '심야 방송',
'liveTv.whatsOn' => '지금 방송 중',
'liveTv.watchChannel' => '채널 시청',
'collections.title' => '컬렉션',
'collections.collection' => '컬렉션',
'collections.empty' => '컬렉션이 비어 있습니다',
@@ -1726,9 +1728,9 @@ extension on TranslationsKo {
'collections.deleteConfirm' => ({required Object title}) => '"${title}"을(를) 삭제 하시겠습니까? 이 작업은 되돌릴 수 없습니다.',
'collections.deleted' => '컬렉션 삭제됨',
'collections.deleteFailed' => '컬렉션 삭제 실패',
'collections.deleteFailedWithError' => ({required Object error}) => '컬렉션 삭제 실패: ${error}',
_ => null,
} ?? switch (path) {
'collections.deleteFailedWithError' => ({required Object error}) => '컬렉션 삭제 실패: ${error}',
'collections.failedToLoadItems' => ({required Object error}) => '컬렉션 항목 로드 실패: ${error}',
'collections.selectCollection' => '컬렉션 선택',
'collections.createNewCollection' => '새 컬렉션 생성',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvNl implements TranslationsLiveTvEn {
@override String get evening => 'Avond';
@override String get lateNight => 'Late avond';
@override String get whatsOn => 'Nu op TV';
@override String get watchChannel => 'Kanaal bekijken';
}
// Path: downloads
@@ -1718,6 +1719,7 @@ extension on TranslationsNl {
'liveTv.evening' => 'Avond',
'liveTv.lateNight' => 'Late avond',
'liveTv.whatsOn' => 'Nu op TV',
'liveTv.watchChannel' => 'Kanaal bekijken',
'downloads.title' => 'Downloads',
'downloads.manage' => 'Beheren',
'downloads.tvShows' => 'Series',
@@ -1726,9 +1728,9 @@ extension on TranslationsNl {
'downloads.noDownloadsDescription' => 'Gedownloade content verschijnt hier voor offline weergave',
'downloads.downloadNow' => 'Download',
'downloads.deleteDownload' => 'Download verwijderen',
'downloads.retryDownload' => 'Download opnieuw proberen',
_ => null,
} ?? switch (path) {
'downloads.retryDownload' => 'Download opnieuw proberen',
'downloads.downloadQueued' => 'Download in wachtrij',
'downloads.episodesQueued' => ({required Object count}) => '${count} afleveringen in wachtrij voor download',
'downloads.downloadDeleted' => 'Download verwijderd',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvSv implements TranslationsLiveTvEn {
@override String get evening => 'Kväll';
@override String get lateNight => 'Sen kväll';
@override String get whatsOn => 'På TV nu';
@override String get watchChannel => 'Titta på kanal';
}
// Path: downloads
@@ -1718,6 +1719,7 @@ extension on TranslationsSv {
'liveTv.evening' => 'Kväll',
'liveTv.lateNight' => 'Sen kväll',
'liveTv.whatsOn' => 'På TV nu',
'liveTv.watchChannel' => 'Titta på kanal',
'downloads.title' => 'Nedladdningar',
'downloads.manage' => 'Hantera',
'downloads.tvShows' => 'TV-serier',
@@ -1726,9 +1728,9 @@ extension on TranslationsSv {
'downloads.noDownloadsDescription' => 'Nedladdat innehåll visas här för offline-visning',
'downloads.downloadNow' => 'Ladda ner',
'downloads.deleteDownload' => 'Ta bort nedladdning',
'downloads.retryDownload' => 'Försök igen',
_ => null,
} ?? switch (path) {
'downloads.retryDownload' => 'Försök igen',
'downloads.downloadQueued' => 'Nedladdning köad',
'downloads.episodesQueued' => ({required Object count}) => '${count} avsnitt köade för nedladdning',
'downloads.downloadDeleted' => 'Nedladdning borttagen',
+3 -1
View File
@@ -808,6 +808,7 @@ class _TranslationsLiveTvZh implements TranslationsLiveTvEn {
@override String get evening => '晚上';
@override String get lateNight => '深夜';
@override String get whatsOn => '正在播出';
@override String get watchChannel => '观看频道';
}
// Path: downloads
@@ -1718,6 +1719,7 @@ extension on TranslationsZh {
'liveTv.evening' => '晚上',
'liveTv.lateNight' => '深夜',
'liveTv.whatsOn' => '正在播出',
'liveTv.watchChannel' => '观看频道',
'downloads.title' => '下载',
'downloads.manage' => '管理',
'downloads.tvShows' => '电视剧',
@@ -1726,9 +1728,9 @@ extension on TranslationsZh {
'downloads.noDownloadsDescription' => '下载的内容将在此处显示以供离线观看',
'downloads.downloadNow' => '下载',
'downloads.deleteDownload' => '删除下载',
'downloads.retryDownload' => '重试下载',
_ => null,
} ?? switch (path) {
'downloads.retryDownload' => '重试下载',
'downloads.downloadQueued' => '下载已排队',
'downloads.episodesQueued' => ({required Object count}) => '${count} 集已加入下载队列',
'downloads.downloadDeleted' => '下载已删除',
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "Dagtid",
"evening": "Kväll",
"lateNight": "Sen kväll",
"whatsOn": "På TV nu"
"whatsOn": "På TV nu",
"watchChannel": "Titta på kanal"
},
"downloads": {
"title": "Nedladdningar",
+2 -1
View File
@@ -566,7 +566,8 @@
"daytime": "白天",
"evening": "晚上",
"lateNight": "深夜",
"whatsOn": "正在播出"
"whatsOn": "正在播出",
"watchChannel": "观看频道"
},
"downloads": {
"title": "下载",
@@ -215,7 +215,7 @@ class _LiveTvShowScheduleScreenState extends State<LiveTvShowScheduleScreen> {
icon: const AppIcon(Symbols.play_arrow_rounded),
label: Text(t.common.play),
),
const SizedBox(width: 8),
if (program.isCurrentlyAiring) const SizedBox(width: 8),
OutlinedButton.icon(
onPressed: () {
Navigator.of(sheetContext).pop();
@@ -224,6 +224,17 @@ class _LiveTvShowScheduleScreenState extends State<LiveTvShowScheduleScreen> {
icon: const AppIcon(Symbols.fiber_manual_record_rounded),
label: Text(t.liveTv.record),
),
if (!program.isCurrentlyAiring && channel != null) ...[
const SizedBox(width: 8),
OutlinedButton.icon(
onPressed: () {
Navigator.of(sheetContext).pop();
_tuneChannel(channel);
},
icon: const AppIcon(Symbols.live_tv_rounded),
label: Text(t.liveTv.watchChannel),
),
],
],
),
],
@@ -333,7 +344,7 @@ class _ScheduleListTile extends StatelessWidget {
].join('');
return InkWell(
onTap: isLive ? onTap : null,
onTap: onTap,
child: Container(
decoration: isLive
? BoxDecoration(