relatica/lib/controls/audio_video/av_control.dart

131 wiersze
3.4 KiB
Dart

import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:relatica/controls/audio_video/media_kit_av_control.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../globals.dart';
import '../../services/setting_service.dart';
import '../../utils/snackbar_builder.dart';
import 'video_player_lib_av_control.dart';
final _shownVideos = <String>{};
final _useVideoPlayer = kIsWeb || Platform.isAndroid;
final _useMediaKit = Platform.isIOS ||
Platform.isWindows ||
Platform.isMacOS ||
Platform.isLinux;
class AVControl extends StatefulWidget {
final String videoUrl;
final String description;
final double width;
final double height;
const AVControl({
super.key,
required this.videoUrl,
required this.width,
required this.height,
required this.description,
});
@override
State<AVControl> createState() => _AVControlState();
}
class _AVControlState extends State<AVControl> {
void showVideo() {
_shownVideos.add(widget.videoUrl);
setState(() {});
}
@override
Widget build(BuildContext context) {
final shown = !context.watch<SettingsService>().lowBandwidthMode ||
_shownVideos.contains(widget.videoUrl);
final placeHolderBox = SizedBox(
width: widget.width,
height: widget.height,
child: const Card(
color: Colors.black12,
shape: RoundedRectangleBorder(),
child: Icon(Icons.movie)),
);
if (!shown) {
return GestureDetector(
onTap: showVideo,
child: placeHolderBox,
);
}
if (_useVideoPlayer) {
return VideoPlayerLibAvControl(
videoUrl: widget.videoUrl,
width: widget.width,
height: widget.height,
);
}
if (_useMediaKit) {
return MediaKitAvControl(
videoUrl: widget.videoUrl,
width: widget.width,
height: widget.height,
);
}
return buildStandinWidget(context);
}
Widget buildStandinWidget(BuildContext context) {
return GestureDetector(
onTap: () async {
final confirm = await showYesNoDialog(
context, 'Open Link in external app? ${widget.videoUrl}');
if (confirm != true) {
return;
}
if (await canLaunchUrl(Uri.parse(widget.videoUrl))) {
if (context.mounted) {
buildSnackbar(
context,
'Attempting to launch video: ${widget.videoUrl}',
);
}
await launchUrl(Uri.parse(widget.videoUrl));
} else {
if (context.mounted) {
buildSnackbar(
context, 'Unable to launch video: ${widget.videoUrl}');
}
}
},
child: SizedBox(
height: widget.height,
width: widget.width,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
widget.description.isNotEmpty
? widget.description
: 'Video: ${widget.videoUrl}',
softWrap: true,
),
),
),
],
),
));
}
}