Initial Commit
This commit is contained in:
521
lib/screens/settings/komet_misc_screen.dart
Normal file
521
lib/screens/settings/komet_misc_screen.dart
Normal file
@@ -0,0 +1,521 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:disable_battery_optimization/disable_battery_optimization.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'dart:io' show Platform;
|
||||
|
||||
class KometMiscScreen extends StatefulWidget {
|
||||
final bool isModal;
|
||||
|
||||
const KometMiscScreen({super.key, this.isModal = false});
|
||||
|
||||
@override
|
||||
State<KometMiscScreen> createState() => _KometMiscScreenState();
|
||||
}
|
||||
|
||||
class _KometMiscScreenState extends State<KometMiscScreen> {
|
||||
bool? _isBatteryOptimizationDisabled;
|
||||
bool _isAutoUpdateEnabled = true;
|
||||
bool _showUpdateNotification = true;
|
||||
bool _enableWebVersionCheck = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_checkBatteryOptimizationStatus();
|
||||
_loadUpdateSettings();
|
||||
}
|
||||
|
||||
Future<void> _loadUpdateSettings() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
setState(() {
|
||||
|
||||
_isAutoUpdateEnabled = prefs.getBool('auto_update_enabled') ?? true;
|
||||
_showUpdateNotification =
|
||||
prefs.getBool('show_update_notification') ?? true;
|
||||
_enableWebVersionCheck =
|
||||
prefs.getBool('enable_web_version_check') ?? false;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _checkBatteryOptimizationStatus() async {
|
||||
bool? isDisabled =
|
||||
await DisableBatteryOptimization.isBatteryOptimizationDisabled;
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_isBatteryOptimizationDisabled = isDisabled;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _requestDisableBatteryOptimization() async {
|
||||
await DisableBatteryOptimization.showDisableBatteryOptimizationSettings();
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
_checkBatteryOptimizationStatus();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _updateSettings(String key, bool value) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setBool(key, value);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
String subtitleText;
|
||||
Color statusColor;
|
||||
final defaultTextColor = Theme.of(context).textTheme.bodyMedium?.color;
|
||||
|
||||
|
||||
final isDesktopOrIOS =
|
||||
Platform.isWindows ||
|
||||
Platform.isMacOS ||
|
||||
Platform.isLinux ||
|
||||
Platform.isIOS;
|
||||
|
||||
if (isDesktopOrIOS) {
|
||||
subtitleText = "Недоступно";
|
||||
statusColor = Colors.grey;
|
||||
} else if (_isBatteryOptimizationDisabled == null) {
|
||||
subtitleText = "Проверка статуса...";
|
||||
statusColor = Colors.grey;
|
||||
} else if (_isBatteryOptimizationDisabled == true) {
|
||||
subtitleText = "Разрешено";
|
||||
statusColor = Colors.green;
|
||||
} else {
|
||||
subtitleText = "Не разрешено";
|
||||
statusColor = Colors.orange;
|
||||
}
|
||||
|
||||
if (widget.isModal) {
|
||||
return buildModalContent(context);
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: const Text("Komet Misc")),
|
||||
body: ListView(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
children: [
|
||||
Card(
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
child: ListTile(
|
||||
leading: Icon(
|
||||
Icons.battery_charging_full_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Фоновая работа"),
|
||||
subtitle: RichText(
|
||||
text: TextSpan(
|
||||
style: TextStyle(fontSize: 14, color: defaultTextColor),
|
||||
children: <TextSpan>[
|
||||
const TextSpan(text: 'Статус: '),
|
||||
TextSpan(
|
||||
text: subtitleText,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
color: statusColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: isDesktopOrIOS ? null : _requestDisableBatteryOptimization,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
vertical: 8.0,
|
||||
),
|
||||
child: Text(
|
||||
isDesktopOrIOS
|
||||
? 'Фоновая работа недоступна на данной платформе.'
|
||||
: 'Для стабильной работы приложения в фоновом режиме рекомендуется отключить оптимизацию расхода заряда батареи.',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
const Divider(height: 20),
|
||||
|
||||
Card(
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
SwitchListTile(
|
||||
secondary: Icon(
|
||||
Icons.wifi_find_outlined,
|
||||
color: _enableWebVersionCheck
|
||||
? Theme.of(context).colorScheme.primary
|
||||
: Colors.grey,
|
||||
),
|
||||
title: const Text("Проверка версии через web"),
|
||||
subtitle: Text(
|
||||
_enableWebVersionCheck
|
||||
? "Проверяет актуальную версию на web.max.ru"
|
||||
: "Проверка версии отключена",
|
||||
),
|
||||
value: _enableWebVersionCheck,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
_enableWebVersionCheck = value;
|
||||
});
|
||||
_updateSettings('enable_web_version_check', value);
|
||||
},
|
||||
),
|
||||
const Divider(height: 1),
|
||||
SwitchListTile(
|
||||
secondary: Icon(
|
||||
Icons.system_update_alt_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Автообновление сессии"),
|
||||
subtitle: const Text("Версия будет обновляться в фоне"),
|
||||
value: _isAutoUpdateEnabled,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
_isAutoUpdateEnabled = value;
|
||||
});
|
||||
_updateSettings('auto_update_enabled', value);
|
||||
},
|
||||
),
|
||||
|
||||
SwitchListTile(
|
||||
secondary: Icon(
|
||||
Icons.notifications_active_outlined,
|
||||
|
||||
color: _isAutoUpdateEnabled
|
||||
? Colors.grey
|
||||
: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Уведомлять о новой версии"),
|
||||
subtitle: Text(
|
||||
_isAutoUpdateEnabled
|
||||
? "Недоступно при автообновлении"
|
||||
: "Показывать диалог при запуске",
|
||||
),
|
||||
value: _showUpdateNotification,
|
||||
|
||||
onChanged: _isAutoUpdateEnabled
|
||||
? null
|
||||
: (bool value) {
|
||||
setState(() {
|
||||
_showUpdateNotification = value;
|
||||
});
|
||||
_updateSettings('show_update_notification', value);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
vertical: 8.0,
|
||||
),
|
||||
child: Text(
|
||||
'Автообновление автоматически изменит версию вашей сессии на последнюю доступную без дополнительных уведомлений.',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildModalSettings(
|
||||
BuildContext context,
|
||||
String subtitleText,
|
||||
Color statusColor,
|
||||
Color? defaultTextColor,
|
||||
) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.transparent,
|
||||
body: Stack(
|
||||
children: [
|
||||
|
||||
GestureDetector(
|
||||
onTap: () => Navigator.of(context).pop(),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
Center(
|
||||
child: Container(
|
||||
width: 400,
|
||||
height: 600,
|
||||
margin: const EdgeInsets.all(20),
|
||||
decoration: BoxDecoration(
|
||||
color: colors.surface,
|
||||
borderRadius: BorderRadius.circular(16),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
blurRadius: 20,
|
||||
offset: const Offset(0, 10),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
|
||||
Container(
|
||||
padding: const EdgeInsets.all(16),
|
||||
decoration: BoxDecoration(
|
||||
color: colors.surface,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(16),
|
||||
topRight: Radius.circular(16),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
tooltip: 'Назад',
|
||||
),
|
||||
const Expanded(
|
||||
child: Text(
|
||||
"Komet Misc",
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
icon: const Icon(Icons.close),
|
||||
tooltip: 'Закрыть',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
|
||||
Expanded(
|
||||
child: ListView(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
children: [
|
||||
Card(
|
||||
child: ListTile(
|
||||
leading: const Icon(Icons.battery_charging_full),
|
||||
title: const Text("Оптимизация батареи"),
|
||||
subtitle: Text(subtitleText),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.circle,
|
||||
color: statusColor,
|
||||
size: 12,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
const Icon(Icons.chevron_right),
|
||||
],
|
||||
),
|
||||
onTap:
|
||||
Platform.isWindows ||
|
||||
Platform.isMacOS ||
|
||||
Platform.isLinux ||
|
||||
Platform.isIOS
|
||||
? null
|
||||
: _requestDisableBatteryOptimization,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Card(
|
||||
child: Column(
|
||||
children: [
|
||||
SwitchListTile(
|
||||
title: const Text("Автообновления"),
|
||||
subtitle: const Text(
|
||||
"Автоматически проверять обновления",
|
||||
),
|
||||
value: _isAutoUpdateEnabled,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_isAutoUpdateEnabled = value;
|
||||
});
|
||||
_updateSettings('auto_update_enabled', value);
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
title: const Text("Уведомления об обновлениях"),
|
||||
subtitle: const Text(
|
||||
"Показывать уведомления о доступных обновлениях",
|
||||
),
|
||||
value: _showUpdateNotification,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_showUpdateNotification = value;
|
||||
});
|
||||
_updateSettings(
|
||||
'show_update_notification',
|
||||
value,
|
||||
);
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
title: const Text("Проверка веб-версии"),
|
||||
subtitle: const Text(
|
||||
"Проверять обновления через веб-интерфейс",
|
||||
),
|
||||
value: _enableWebVersionCheck,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_enableWebVersionCheck = value;
|
||||
});
|
||||
_updateSettings(
|
||||
'enable_web_version_check',
|
||||
value,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildModalContent(BuildContext context) {
|
||||
String subtitleText;
|
||||
Color statusColor;
|
||||
final defaultTextColor = Theme.of(context).textTheme.bodyMedium?.color;
|
||||
|
||||
|
||||
final isDesktopOrIOS =
|
||||
Platform.isWindows ||
|
||||
Platform.isMacOS ||
|
||||
Platform.isLinux ||
|
||||
Platform.isIOS;
|
||||
|
||||
if (isDesktopOrIOS) {
|
||||
subtitleText = "Недоступно";
|
||||
statusColor = Colors.grey;
|
||||
} else if (_isBatteryOptimizationDisabled == null) {
|
||||
subtitleText = "Проверка статуса...";
|
||||
statusColor = Colors.grey;
|
||||
} else if (_isBatteryOptimizationDisabled == true) {
|
||||
subtitleText = "Разрешено";
|
||||
statusColor = Colors.green;
|
||||
} else {
|
||||
subtitleText = "Не разрешено";
|
||||
statusColor = Colors.orange;
|
||||
}
|
||||
|
||||
return ListView(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
children: [
|
||||
Card(
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
child: ListTile(
|
||||
leading: Icon(
|
||||
Icons.battery_charging_full_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Фоновая работа"),
|
||||
subtitle: RichText(
|
||||
text: TextSpan(
|
||||
style: TextStyle(fontSize: 14, color: defaultTextColor),
|
||||
children: <TextSpan>[
|
||||
const TextSpan(text: 'Статус: '),
|
||||
TextSpan(
|
||||
text: subtitleText,
|
||||
style: TextStyle(
|
||||
color: statusColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
trailing: const Icon(Icons.chevron_right_rounded),
|
||||
onTap: isDesktopOrIOS ? null : _requestDisableBatteryOptimization,
|
||||
),
|
||||
),
|
||||
Card(
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
SwitchListTile(
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
secondary: Icon(
|
||||
Icons.system_update_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Автообновления"),
|
||||
subtitle: const Text(
|
||||
"Автоматически проверять и устанавливать обновления",
|
||||
),
|
||||
value: _isAutoUpdateEnabled,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_isAutoUpdateEnabled = value;
|
||||
});
|
||||
_updateSettings('auto_update_enabled', value);
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
secondary: Icon(
|
||||
Icons.notifications_active_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Уведомления об обновлениях"),
|
||||
subtitle: const Text(
|
||||
"Показывать уведомления о доступных обновлениях",
|
||||
),
|
||||
value: _showUpdateNotification,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_showUpdateNotification = value;
|
||||
});
|
||||
_updateSettings('show_update_notification', value);
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
secondary: Icon(
|
||||
Icons.web_rounded,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
title: const Text("Проверка веб-версии"),
|
||||
subtitle: const Text(
|
||||
"Проверять обновления веб-версии приложения",
|
||||
),
|
||||
value: _enableWebVersionCheck,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_enableWebVersionCheck = value;
|
||||
});
|
||||
_updateSettings('enable_web_version_check', value);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user