fix: More native player UI fixes

This commit is contained in:
PartyDonut 2025-10-14 18:25:54 +02:00
parent edbd8d467c
commit cfd4b4a5cc
12 changed files with 217 additions and 55 deletions

View file

@ -1,11 +1,17 @@
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:http/http.dart' as http;
import 'package:markdown_widget/widget/markdown.dart';
import 'package:path_provider/path_provider.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/providers/update_provider.dart';
import 'package:fladder/screens/settings/settings_list_tile.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/screens/shared/media/external_urls.dart';
import 'package:fladder/util/list_padding.dart';
import 'package:fladder/util/localization_helper.dart';
@ -87,6 +93,8 @@ class UpdateInformation extends StatelessWidget {
@override
Widget build(BuildContext context) {
final apkDownload =
releaseInfo.preferredDownloads.entries.where((entry) => entry.value.toLowerCase().endsWith('.apk')).firstOrNull;
return ExpansionTile(
backgroundColor:
releaseInfo.isNewerThanCurrent ? context.colors.primaryContainer : context.colors.surfaceContainer,
@ -107,6 +115,32 @@ class UpdateInformation extends StatelessWidget {
),
),
),
if (apkDownload != null)
FilledButton(
onPressed: () async {
try {
final response = await http.get(Uri.parse(apkDownload.value));
final tempDir = await getTemporaryDirectory();
final apkPath = '${tempDir.path}/update.apk';
if (response.statusCode == 200) {
final file = File(apkPath);
await file.writeAsBytes(response.bodyBytes);
launchUrl(context, file.path);
} else {
throw Exception('Failed to download APK: ${response.statusCode}');
}
} catch (e) {
if (context.mounted) {
fladderSnackbar(context, title: 'Failed to download update: $e');
}
}
},
child: const Text(
"Install",
),
),
...releaseInfo.preferredDownloads.entries.map(
(entry) {
return FilledButton(

View file

@ -26,7 +26,7 @@ class DetailedBanner extends ConsumerStatefulWidget {
}
class _DetailedBannerState extends ConsumerState<DetailedBanner> {
late ItemBaseModel selectedPoster = widget.posters.first;
late ValueNotifier<ItemBaseModel> selectedPoster = ValueNotifier(widget.posters.first);
@override
Widget build(BuildContext context) {
@ -45,8 +45,11 @@ class _DetailedBannerState extends ConsumerState<DetailedBanner> {
child: AspectRatio(
aspectRatio: 1.8,
child: CustomShaderMask(
child: FladderImage(
image: selectedPoster.images?.primary,
child: ValueListenableBuilder(
valueListenable: selectedPoster,
builder: (context, value, child) => FladderImage(
image: value.images?.primary,
),
),
),
),
@ -68,20 +71,23 @@ class _DetailedBannerState extends ConsumerState<DetailedBanner> {
padding: const EdgeInsets.symmetric(horizontal: 16).copyWith(bottom: 4),
child: FractionallySizedBox(
widthFactor: AdaptiveLayout.viewSizeOf(context) <= ViewSize.phone ? 1.0 : 0.55,
child: OverviewHeader(
name: selectedPoster.parentBaseModel.name,
subTitle: selectedPoster.label(context),
image: selectedPoster.getPosters,
logoAlignment: AdaptiveLayout.viewSizeOf(context) <= ViewSize.phone
? Alignment.center
: Alignment.centerLeft,
summary: selectedPoster.overview.summary,
productionYear: selectedPoster.overview.productionYear,
runTime: selectedPoster.overview.runTime,
genres: selectedPoster.overview.genreItems,
studios: selectedPoster.overview.studios,
officialRating: selectedPoster.overview.parentalRating,
communityRating: selectedPoster.overview.communityRating,
child: ValueListenableBuilder(
valueListenable: selectedPoster,
builder: (context, value, child) => OverviewHeader(
name: value.parentBaseModel.name,
subTitle: value.label(context),
image: value.getPosters,
logoAlignment: AdaptiveLayout.viewSizeOf(context) <= ViewSize.phone
? Alignment.center
: Alignment.centerLeft,
summary: value.overview.summary,
productionYear: value.overview.productionYear,
runTime: value.overview.runTime,
genres: value.overview.genreItems,
studios: value.overview.studios,
officialRating: value.overview.parentalRating,
communityRating: value.overview.communityRating,
),
),
),
),
@ -97,9 +103,7 @@ class _DetailedBannerState extends ConsumerState<DetailedBanner> {
context.ensureVisible(
alignment: 1.0,
);
setState(() {
selectedPoster = poster;
});
selectedPoster.value = poster;
widget.onSelect(poster);
},
),