Files
pilipala/lib/services/shutdown_timer_service.dart
2024-05-15 23:55:04 +08:00

145 lines
4.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 定时关闭服务
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import '../plugin/pl_player/controller.dart';
class ShutdownTimerService {
static final ShutdownTimerService _instance =
ShutdownTimerService._internal();
Timer? _shutdownTimer;
Timer? _autoCloseDialogTimer;
//定时退出
int scheduledExitInMinutes = -1;
bool exitApp = false;
bool waitForPlayingCompleted = false;
bool isWaiting = false;
factory ShutdownTimerService() => _instance;
ShutdownTimerService._internal();
void startShutdownTimer() {
cancelShutdownTimer(); // Cancel any previous timer
if (scheduledExitInMinutes == -1) {
//使用toast提示用户已取消
SmartDialog.showToast("取消定时关闭");
return;
}
SmartDialog.showToast("设置 $scheduledExitInMinutes 分钟后定时关闭");
_shutdownTimer = Timer(
Duration(minutes: scheduledExitInMinutes), () => _shutdownDecider());
}
void _showTimeUpButPauseDialog() {
SmartDialog.show(
builder: (BuildContext dialogContext) {
return AlertDialog(
title: const Text('定时关闭'),
content: const Text('时间到啦!'),
actions: <Widget>[
TextButton(
child: const Text('确认'),
onPressed: () {
cancelShutdownTimer();
SmartDialog.dismiss();
},
),
],
);
},
);
}
void _showShutdownDialog() {
SmartDialog.show(
builder: (BuildContext dialogContext) {
// Start the 10-second timer to auto close the dialog
_autoCloseDialogTimer?.cancel();
_autoCloseDialogTimer = Timer(const Duration(seconds: 10), () {
SmartDialog.dismiss(); // Close the dialog
_executeShutdown();
});
return AlertDialog(
title: const Text('定时关闭'),
content: const Text('将在10秒后执行是否需要取消'),
actions: <Widget>[
TextButton(
child: const Text('取消关闭'),
onPressed: () {
_autoCloseDialogTimer?.cancel(); // Cancel the auto-close timer
cancelShutdownTimer(); // Cancel the shutdown timer
SmartDialog.dismiss(); // Close the dialog
},
),
],
);
},
).then((_) {
// Cleanup when the dialog is dismissed
_autoCloseDialogTimer?.cancel();
});
}
void _shutdownDecider() {
if (exitApp && !waitForPlayingCompleted) {
_showShutdownDialog();
return;
}
PlPlayerController plPlayerController =
PlPlayerController(videoType: 'none');
if (!exitApp && !waitForPlayingCompleted) {
if (!plPlayerController.playerStatus.playing) {
//仅提示用户
_showTimeUpButPauseDialog();
} else {
_showShutdownDialog();
}
return;
}
//waitForPlayingCompleted
if (!plPlayerController.playerStatus.playing) {
_showShutdownDialog();
return;
}
SmartDialog.showToast("定时关闭时间已到,等待当前视频播放完成");
//监听播放完成
//该方法依赖耦合实现,不够优雅
isWaiting = true;
}
void handleWaitingFinished() {
if (isWaiting) {
_showShutdownDialog();
isWaiting = false;
}
}
void _executeShutdown() {
if (exitApp) {
//退出app
exit(0);
} else {
//暂停播放
PlPlayerController plPlayerController =
PlPlayerController(videoType: 'none');
if (plPlayerController.playerStatus.playing) {
plPlayerController.pause();
waitForPlayingCompleted = true;
SmartDialog.showToast("已暂停播放");
} else {
SmartDialog.showToast("当前未播放");
}
}
}
void cancelShutdownTimer() {
isWaiting = false;
_shutdownTimer?.cancel();
}
}
final shutdownTimerService = ShutdownTimerService();