fix: remove ticks from seekbar & change video source correctly

This commit is contained in:
Prateek Sunal
2025-02-28 14:26:42 +05:30
parent e9633e48ab
commit 11a42e7ee3
3 changed files with 64 additions and 26 deletions

View File

@@ -0,0 +1,7 @@
import "package:photos/events/event.dart";
class SeekbarTriggeredEvent extends Event {
final int position;
SeekbarTriggeredEvent({required this.position});
}

View File

@@ -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,

View File

@@ -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();
}
}