backup_settings_screen.dart 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/configuration.dart';
  4. import 'package:photos/theme/ente_theme.dart';
  5. import 'package:photos/ui/common/dialogs.dart';
  6. import 'package:photos/ui/components/captioned_text_widget.dart';
  7. import 'package:photos/ui/components/icon_button_widget.dart';
  8. import 'package:photos/ui/components/menu_item_widget.dart';
  9. import 'package:photos/ui/components/menu_section_description_widget.dart';
  10. import 'package:photos/ui/components/title_bar_title_widget.dart';
  11. import 'package:photos/ui/components/title_bar_widget.dart';
  12. import 'package:photos/ui/components/toggle_switch_widget.dart';
  13. class BackupSettingsScreen extends StatelessWidget {
  14. const BackupSettingsScreen({super.key});
  15. @override
  16. Widget build(BuildContext context) {
  17. final colorScheme = getEnteColorScheme(context);
  18. return Scaffold(
  19. body: CustomScrollView(
  20. primary: false,
  21. slivers: <Widget>[
  22. TitleBarWidget(
  23. flexibleSpaceTitle: const TitleBarTitleWidget(
  24. title: "Backup settings",
  25. ),
  26. actionIcons: [
  27. IconButtonWidget(
  28. icon: Icons.close_outlined,
  29. isSecondary: true,
  30. onTap: () {
  31. Navigator.pop(context);
  32. },
  33. ),
  34. ],
  35. ),
  36. SliverFixedExtentList(
  37. itemExtent: 269,
  38. delegate: SliverChildBuilderDelegate(
  39. (context, index) {
  40. return Padding(
  41. padding: const EdgeInsets.symmetric(horizontal: 16),
  42. child: Padding(
  43. padding: const EdgeInsets.symmetric(vertical: 20),
  44. child: Column(
  45. mainAxisSize: MainAxisSize.min,
  46. children: [
  47. Column(
  48. children: [
  49. MenuItemWidget(
  50. captionedTextWidget: const CaptionedTextWidget(
  51. title: "Backup over mobile data",
  52. ),
  53. menuItemColor: colorScheme.fillFaint,
  54. trailingSwitch: ToggleSwitchWidget(
  55. value: () {
  56. return Configuration.instance
  57. .shouldBackupOverMobileData();
  58. },
  59. onChanged: () async {
  60. await Configuration.instance
  61. .setBackupOverMobileData(
  62. !Configuration.instance
  63. .shouldBackupOverMobileData(),
  64. );
  65. },
  66. ),
  67. borderRadius: 8,
  68. alignCaptionedTextToLeft: true,
  69. isBottomBorderRadiusRemoved: true,
  70. isGestureDetectorDisabled: true,
  71. ),
  72. const SizedBox(height: 1),
  73. MenuItemWidget(
  74. captionedTextWidget: const CaptionedTextWidget(
  75. title: "Backup videos",
  76. ),
  77. menuItemColor: colorScheme.fillFaint,
  78. trailingSwitch: ToggleSwitchWidget(
  79. value: () =>
  80. Configuration.instance.shouldBackupVideos(),
  81. onChanged: () => Configuration.instance
  82. .setShouldBackupVideos(
  83. !Configuration.instance.shouldBackupVideos(),
  84. ),
  85. ),
  86. borderRadius: 8,
  87. alignCaptionedTextToLeft: true,
  88. isTopBorderRadiusRemoved: true,
  89. isGestureDetectorDisabled: true,
  90. ),
  91. ],
  92. ),
  93. const SizedBox(height: 24),
  94. Platform.isIOS
  95. ? Column(
  96. children: [
  97. MenuItemWidget(
  98. captionedTextWidget:
  99. const CaptionedTextWidget(
  100. title: "Disable auto lock",
  101. ),
  102. menuItemColor: colorScheme.fillFaint,
  103. trailingSwitch: ToggleSwitchWidget(
  104. value: () => Configuration.instance
  105. .shouldKeepDeviceAwake(),
  106. onChanged: () {
  107. return _autoLockOnChanged(
  108. !Configuration.instance
  109. .shouldKeepDeviceAwake(),
  110. context,
  111. );
  112. },
  113. ),
  114. borderRadius: 8,
  115. alignCaptionedTextToLeft: true,
  116. isGestureDetectorDisabled: true,
  117. ),
  118. const MenuSectionDescriptionWidget(
  119. content:
  120. "Disable the device screen lock when ente is in the foreground and there is a backup in progress. This is normally not needed, but may help big uploads and initial imports of large libraries complete faster.",
  121. )
  122. ],
  123. )
  124. : const SizedBox.shrink(),
  125. ],
  126. ),
  127. ),
  128. );
  129. },
  130. childCount: 1,
  131. ),
  132. ),
  133. ],
  134. ),
  135. );
  136. }
  137. Future<void> _autoLockOnChanged(value, context) async {
  138. if (value) {
  139. final choice = await showChoiceDialog(
  140. context,
  141. "Disable automatic screen lock when ente is running?",
  142. "This will ensure faster uploads by ensuring your device does not sleep when uploads are in progress.",
  143. firstAction: "No",
  144. secondAction: "Yes",
  145. );
  146. if (choice != DialogUserChoice.secondChoice) {
  147. return;
  148. }
  149. }
  150. await Configuration.instance.setShouldKeepDeviceAwake(value);
  151. }
  152. }