mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
fix: More native player UI fixes
This commit is contained in:
parent
edbd8d467c
commit
cfd4b4a5cc
12 changed files with 217 additions and 55 deletions
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
},
|
||||
),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue