feat: Android TV support (#503)

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-09-28 21:07:49 +02:00 committed by GitHub
parent 7ab8c015b9
commit c299492d6d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
168 changed files with 12019 additions and 3073 deletions

View file

@ -8,12 +8,14 @@ abstract class ArgumentsModel with _$ArgumentsModel {
factory ArgumentsModel({
@Default(false) bool htpcMode,
@Default(false) bool leanBackMode,
}) = _ArgumentsModel;
factory ArgumentsModel.fromArguments(List<String> arguments) {
factory ArgumentsModel.fromArguments(List<String> arguments, bool leanBackEnabled) {
arguments = arguments.map((e) => e.trim()).toList();
return ArgumentsModel(
htpcMode: arguments.contains('--htpc'),
htpcMode: arguments.contains('--htpc') || leanBackEnabled,
leanBackMode: leanBackEnabled,
);
}
}

View file

@ -15,10 +15,11 @@ T _$identity<T>(T value) => value;
/// @nodoc
mixin _$ArgumentsModel {
bool get htpcMode;
bool get leanBackMode;
@override
String toString() {
return 'ArgumentsModel(htpcMode: $htpcMode)';
return 'ArgumentsModel(htpcMode: $htpcMode, leanBackMode: $leanBackMode)';
}
}
@ -115,13 +116,13 @@ extension ArgumentsModelPatterns on ArgumentsModel {
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>(
TResult Function(bool htpcMode)? $default, {
TResult Function(bool htpcMode, bool leanBackMode)? $default, {
required TResult orElse(),
}) {
final _that = this;
switch (_that) {
case _ArgumentsModel() when $default != null:
return $default(_that.htpcMode);
return $default(_that.htpcMode, _that.leanBackMode);
case _:
return orElse();
}
@ -142,12 +143,12 @@ extension ArgumentsModelPatterns on ArgumentsModel {
@optionalTypeArgs
TResult when<TResult extends Object?>(
TResult Function(bool htpcMode) $default,
TResult Function(bool htpcMode, bool leanBackMode) $default,
) {
final _that = this;
switch (_that) {
case _ArgumentsModel():
return $default(_that.htpcMode);
return $default(_that.htpcMode, _that.leanBackMode);
case _:
throw StateError('Unexpected subclass');
}
@ -167,12 +168,12 @@ extension ArgumentsModelPatterns on ArgumentsModel {
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>(
TResult? Function(bool htpcMode)? $default,
TResult? Function(bool htpcMode, bool leanBackMode)? $default,
) {
final _that = this;
switch (_that) {
case _ArgumentsModel() when $default != null:
return $default(_that.htpcMode);
return $default(_that.htpcMode, _that.leanBackMode);
case _:
return null;
}
@ -182,15 +183,19 @@ extension ArgumentsModelPatterns on ArgumentsModel {
/// @nodoc
class _ArgumentsModel extends ArgumentsModel {
_ArgumentsModel({this.htpcMode = false}) : super._();
_ArgumentsModel({this.htpcMode = false, this.leanBackMode = false})
: super._();
@override
@JsonKey()
final bool htpcMode;
@override
@JsonKey()
final bool leanBackMode;
@override
String toString() {
return 'ArgumentsModel(htpcMode: $htpcMode)';
return 'ArgumentsModel(htpcMode: $htpcMode, leanBackMode: $leanBackMode)';
}
}

View file

@ -40,7 +40,8 @@ T selectAvailableOrSmaller<T>(T value, Set<T> availableOptions, List<T> allOptio
enum HomeBanner {
hide,
carousel,
banner;
banner,
detailedBanner;
const HomeBanner();
@ -48,6 +49,7 @@ enum HomeBanner {
HomeBanner.hide => context.localized.hide,
HomeBanner.carousel => context.localized.homeBannerCarousel,
HomeBanner.banner => context.localized.homeBannerSlideshow,
HomeBanner.detailedBanner => 'Detailed banner'
};
}

View file

@ -47,12 +47,14 @@ const _$ViewSizeEnumMap = {
ViewSize.phone: 'phone',
ViewSize.tablet: 'tablet',
ViewSize.desktop: 'desktop',
ViewSize.television: 'television',
};
const _$HomeBannerEnumMap = {
HomeBanner.hide: 'hide',
HomeBanner.carousel: 'carousel',
HomeBanner.banner: 'banner',
HomeBanner.detailedBanner: 'detailedBanner',
};
const _$HomeCarouselSettingsEnumMap = {

View file

@ -127,11 +127,17 @@ abstract class VideoPlayerSettingsModel with _$VideoPlayerSettingsModel {
enum PlayerOptions {
libMDK,
libMPV;
libMPV,
nativePlayer;
const PlayerOptions();
static Iterable<PlayerOptions> get available => kIsWeb ? {PlayerOptions.libMPV} : PlayerOptions.values;
static Iterable<PlayerOptions> get available => kIsWeb
? {PlayerOptions.libMPV}
: switch (defaultTargetPlatform) {
TargetPlatform.android => PlayerOptions.values,
_ => {PlayerOptions.libMDK, PlayerOptions.libMPV},
};
static PlayerOptions get platformDefaults {
if (kIsWeb) return PlayerOptions.libMPV;
@ -143,6 +149,7 @@ enum PlayerOptions {
String label(BuildContext context) => switch (this) {
PlayerOptions.libMDK => "MDK",
PlayerOptions.libMPV => "MPV",
PlayerOptions.nativePlayer => "Native",
};
}

View file

@ -82,6 +82,7 @@ const _$BoxFitEnumMap = {
const _$PlayerOptionsEnumMap = {
PlayerOptions.libMDK: 'libMDK',
PlayerOptions.libMPV: 'libMPV',
PlayerOptions.nativePlayer: 'nativePlayer',
};
const _$DeviceOrientationEnumMap = {