fix: remove ticks from seekbar & change video source correctly
This commit is contained in:
7
mobile/lib/events/seekbar_triggered_event.dart
Normal file
7
mobile/lib/events/seekbar_triggered_event.dart
Normal file
@@ -0,0 +1,7 @@
|
||||
import "package:photos/events/event.dart";
|
||||
|
||||
class SeekbarTriggeredEvent extends Event {
|
||||
final int position;
|
||||
|
||||
SeekbarTriggeredEvent({required this.position});
|
||||
}
|
||||
@@ -2,6 +2,8 @@ import "dart:async";
|
||||
|
||||
import "package:flutter/material.dart";
|
||||
import "package:native_video_player/native_video_player.dart";
|
||||
import "package:photos/core/event_bus.dart";
|
||||
import "package:photos/events/seekbar_triggered_event.dart";
|
||||
import "package:photos/theme/colors.dart";
|
||||
import "package:photos/theme/ente_theme.dart";
|
||||
import "package:photos/utils/debouncer.dart";
|
||||
@@ -23,6 +25,7 @@ class _SeekBarState extends State<SeekBar> with SingleTickerProviderStateMixin {
|
||||
executionInterval: const Duration(milliseconds: 325),
|
||||
);
|
||||
StreamSubscription<void>? _eventsSubscription;
|
||||
StreamSubscription<SeekbarTriggeredEvent>? _seekbarSubscription;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -33,6 +36,16 @@ class _SeekBarState extends State<SeekBar> with SingleTickerProviderStateMixin {
|
||||
value: 0,
|
||||
);
|
||||
|
||||
Future.microtask(() {
|
||||
_seekbarSubscription =
|
||||
Bus.instance.on<SeekbarTriggeredEvent>().listen((event) {
|
||||
if (!mounted || _animationController.value == event.position) return;
|
||||
|
||||
_animationController.value = event.position.toDouble();
|
||||
setState(() {});
|
||||
});
|
||||
});
|
||||
|
||||
_eventsSubscription = widget.controller.events.listen(
|
||||
_listen,
|
||||
);
|
||||
@@ -42,6 +55,7 @@ class _SeekBarState extends State<SeekBar> with SingleTickerProviderStateMixin {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_seekbarSubscription?.cancel();
|
||||
_eventsSubscription?.cancel();
|
||||
_animationController.dispose();
|
||||
_debouncer.cancelDebounceTimer();
|
||||
@@ -57,6 +71,7 @@ class _SeekBarState extends State<SeekBar> with SingleTickerProviderStateMixin {
|
||||
return SliderTheme(
|
||||
data: SliderTheme.of(context).copyWith(
|
||||
trackHeight: 1.0,
|
||||
tickMarkShape: SliderTickMarkShape.noTickMark,
|
||||
thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8.0),
|
||||
overlayShape: const RoundSliderOverlayShape(overlayRadius: 14.0),
|
||||
activeTrackColor: colorScheme.primary300,
|
||||
|
||||
@@ -10,6 +10,7 @@ import "package:photos/core/constants.dart";
|
||||
import "package:photos/core/event_bus.dart";
|
||||
import "package:photos/events/guest_view_event.dart";
|
||||
import "package:photos/events/pause_video_event.dart";
|
||||
import "package:photos/events/seekbar_triggered_event.dart";
|
||||
import "package:photos/events/stream_switched_event.dart";
|
||||
import "package:photos/events/use_media_kit_for_video.dart";
|
||||
import "package:photos/generated/l10n.dart";
|
||||
@@ -108,38 +109,51 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
Bus.instance.on<StreamSwitchedEvent>().listen((event) {
|
||||
if (event.type != PlayerType.nativeVideoPlayer) return;
|
||||
if (event.selectedPreview) {
|
||||
loadPreview();
|
||||
loadPreview(update: true);
|
||||
} else {
|
||||
loadOriginal();
|
||||
loadOriginal(update: true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void loadPreview() {
|
||||
_setFilePathForNativePlayer(widget.playlistData!.preview.path);
|
||||
Future<void> setVideoSource() async {
|
||||
final videoSource = VideoSource(
|
||||
path: _filePath!,
|
||||
type: VideoSourceType.file,
|
||||
);
|
||||
await _controller?.loadVideo(videoSource);
|
||||
await _controller?.play();
|
||||
|
||||
Bus.instance.fire(SeekbarTriggeredEvent(position: 0));
|
||||
}
|
||||
|
||||
void loadOriginal() {
|
||||
void loadPreview({bool update = false}) async {
|
||||
_setFilePathForNativePlayer(widget.playlistData!.preview.path, update);
|
||||
|
||||
await setVideoSource();
|
||||
}
|
||||
|
||||
void loadOriginal({bool update = false}) async {
|
||||
if (widget.file.isRemoteFile) {
|
||||
_loadNetworkVideo();
|
||||
_loadNetworkVideo(update);
|
||||
_setFileSizeIfNull();
|
||||
} else if (widget.file.isSharedMediaToAppSandbox) {
|
||||
final localFile = File(getSharedMediaFilePath(widget.file));
|
||||
if (localFile.existsSync()) {
|
||||
_setFilePathForNativePlayer(localFile.path);
|
||||
_setFilePathForNativePlayer(localFile.path, update);
|
||||
} else if (widget.file.uploadedFileID != null) {
|
||||
_loadNetworkVideo();
|
||||
_loadNetworkVideo(update);
|
||||
}
|
||||
} else {
|
||||
widget.file.getAsset.then((asset) async {
|
||||
await widget.file.getAsset.then((asset) async {
|
||||
if (asset == null || !(await asset.exists)) {
|
||||
if (widget.file.uploadedFileID != null) {
|
||||
_loadNetworkVideo();
|
||||
_loadNetworkVideo(update);
|
||||
}
|
||||
} else {
|
||||
// ignore: unawaited_futures
|
||||
getFile(widget.file, isOrigin: true).then((file) {
|
||||
_setFilePathForNativePlayer(file!.path);
|
||||
_setFilePathForNativePlayer(file!.path, update);
|
||||
if (Platform.isIOS) {
|
||||
_shouldClearCache = true;
|
||||
}
|
||||
@@ -147,6 +161,9 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
}
|
||||
});
|
||||
}
|
||||
if (update) {
|
||||
await setVideoSource();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -372,11 +389,7 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
|
||||
_isSeeking.addListener(_seekListener);
|
||||
|
||||
final videoSource = VideoSource(
|
||||
path: _filePath!,
|
||||
type: VideoSourceType.file,
|
||||
);
|
||||
await controller.loadVideo(videoSource);
|
||||
await setVideoSource();
|
||||
} catch (e) {
|
||||
_logger.severe(
|
||||
"Error initializing native video player controller for file gen id: ${widget.file.generatedID}",
|
||||
@@ -478,7 +491,7 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
}
|
||||
}
|
||||
|
||||
void _loadNetworkVideo() {
|
||||
void _loadNetworkVideo(bool update) {
|
||||
getFileFromServer(
|
||||
widget.file,
|
||||
progressCallback: (count, total) {
|
||||
@@ -494,7 +507,7 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
},
|
||||
).then((file) {
|
||||
if (file != null) {
|
||||
_setFilePathForNativePlayer(file.path);
|
||||
_setFilePathForNativePlayer(file.path, update);
|
||||
}
|
||||
}).onError((error, stackTrace) {
|
||||
showErrorDialog(
|
||||
@@ -578,14 +591,17 @@ class _VideoWidgetNativeState extends State<VideoWidgetNative>
|
||||
);
|
||||
}
|
||||
|
||||
void _setFilePathForNativePlayer(String url) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_filePath = url;
|
||||
});
|
||||
_setAspectRatioFromVideoProps().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
void _setFilePathForNativePlayer(String url, bool update) {
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
_filePath = url;
|
||||
});
|
||||
_setAspectRatioFromVideoProps().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
|
||||
if (update) {
|
||||
setVideoSource();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user