backup_section_widget.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import 'dart:io';
  2. import 'package:flutter/material.dart';
  3. import 'package:photos/core/configuration.dart';
  4. import 'package:photos/models/backup_status.dart';
  5. import 'package:photos/services/sync_service.dart';
  6. import 'package:photos/ui/backup_folder_selection_widget.dart';
  7. import 'package:photos/ui/free_space_page.dart';
  8. import 'package:photos/ui/settings/settings_section_title.dart';
  9. import 'package:photos/ui/settings/settings_text_item.dart';
  10. import 'package:photos/utils/data_util.dart';
  11. import 'package:photos/utils/dialog_util.dart';
  12. import 'package:photos/utils/navigation_util.dart';
  13. import 'package:photos/utils/toast_util.dart';
  14. import 'package:url_launcher/url_launcher.dart';
  15. class BackupSectionWidget extends StatefulWidget {
  16. BackupSectionWidget({Key key}) : super(key: key);
  17. @override
  18. BackupSectionWidgetState createState() => BackupSectionWidgetState();
  19. }
  20. class BackupSectionWidgetState extends State<BackupSectionWidget> {
  21. @override
  22. Widget build(BuildContext context) {
  23. return Container(
  24. child: Column(
  25. children: [
  26. SettingsSectionTitle("backup"),
  27. Padding(
  28. padding: EdgeInsets.all(4),
  29. ),
  30. GestureDetector(
  31. behavior: HitTestBehavior.translucent,
  32. onTap: () async {
  33. showDialog(
  34. context: context,
  35. builder: (context) {
  36. return AlertDialog(
  37. content: const BackupFolderSelectionWidget("backup"),
  38. backgroundColor: Color.fromRGBO(8, 18, 18, 1),
  39. insetPadding: const EdgeInsets.all(24),
  40. contentPadding: const EdgeInsets.all(24),
  41. );
  42. },
  43. barrierColor: Colors.black.withOpacity(0.85),
  44. );
  45. },
  46. child: SettingsTextItem(
  47. text: "backed up folders", icon: Icons.navigate_next),
  48. ),
  49. Platform.isIOS
  50. ? Padding(padding: EdgeInsets.all(2))
  51. : Padding(padding: EdgeInsets.all(2)),
  52. Divider(height: 4),
  53. Platform.isIOS
  54. ? Padding(padding: EdgeInsets.all(2))
  55. : Padding(padding: EdgeInsets.all(4)),
  56. Container(
  57. height: 36,
  58. child: Row(
  59. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  60. children: [
  61. Text("backup over mobile data"),
  62. Switch(
  63. value: Configuration.instance.shouldBackupOverMobileData(),
  64. onChanged: (value) async {
  65. Configuration.instance.setBackupOverMobileData(value);
  66. setState(() {});
  67. },
  68. ),
  69. ],
  70. ),
  71. ),
  72. Platform.isIOS
  73. ? Padding(padding: EdgeInsets.all(2))
  74. : Padding(padding: EdgeInsets.all(4)),
  75. Divider(height: 4),
  76. Platform.isIOS
  77. ? Padding(padding: EdgeInsets.all(2))
  78. : Padding(padding: EdgeInsets.all(2)),
  79. GestureDetector(
  80. behavior: HitTestBehavior.translucent,
  81. onTap: () async {
  82. final dialog = createProgressDialog(context, "calculating...");
  83. await dialog.show();
  84. final status = await SyncService.instance.getBackupStatus();
  85. await dialog.hide();
  86. if (status.localIDs.isEmpty) {
  87. showErrorDialog(context, "✨ all clear",
  88. "you've no files on this device that can be deleted");
  89. } else {
  90. bool result = await routeToPage(context, FreeSpacePage(status));
  91. if (result == true) {
  92. _showSpaceFreedDialog(status);
  93. }
  94. }
  95. },
  96. child: SettingsTextItem(
  97. text: "free up space",
  98. icon: Icons.navigate_next,
  99. ),
  100. ),
  101. ],
  102. ),
  103. );
  104. }
  105. void _showSpaceFreedDialog(BackupStatus status) {
  106. AlertDialog alert = AlertDialog(
  107. title: Text("success"),
  108. content: Text(
  109. "you have successfully freed up " + formatBytes(status.size) + "!"),
  110. actions: [
  111. TextButton(
  112. child: Text(
  113. "rate us",
  114. style: TextStyle(
  115. color: Theme.of(context).buttonColor,
  116. ),
  117. ),
  118. onPressed: () {
  119. Navigator.of(context, rootNavigator: true).pop('dialog');
  120. if (Platform.isAndroid) {
  121. launch(
  122. "https://play.google.com/store/apps/details?id=io.ente.photos");
  123. } else {
  124. launch("https://apps.apple.com/in/app/ente-photos/id1542026904");
  125. }
  126. },
  127. ),
  128. TextButton(
  129. child: Text(
  130. "ok",
  131. style: TextStyle(
  132. color: Colors.white,
  133. ),
  134. ),
  135. onPressed: () {
  136. if (Platform.isIOS) {
  137. showToast(
  138. "also empty \"Recently Deleted\" from \"Settings\" -> \"Storage\" to claim the freed space");
  139. }
  140. Navigator.of(context, rootNavigator: true).pop('dialog');
  141. },
  142. ),
  143. ],
  144. );
  145. showConfettiDialog(
  146. context: context,
  147. builder: (BuildContext context) {
  148. return alert;
  149. },
  150. barrierColor: Colors.black87,
  151. confettiAlignment: Alignment.topCenter,
  152. useRootNavigator: true,
  153. );
  154. }
  155. }