loading_photos_widget.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:loading_animations/loading_animations.dart';
  4. import 'package:photos/core/event_bus.dart';
  5. import 'package:photos/events/sync_status_update_event.dart';
  6. import 'package:photos/services/local_sync_service.dart';
  7. import 'package:photos/ui/backup_folder_selection_page.dart';
  8. import 'package:photos/utils/navigation_util.dart';
  9. class LoadingPhotosWidget extends StatefulWidget {
  10. const LoadingPhotosWidget({Key key}) : super(key: key);
  11. @override
  12. _LoadingPhotosWidgetState createState() => _LoadingPhotosWidgetState();
  13. }
  14. class _LoadingPhotosWidgetState extends State<LoadingPhotosWidget> {
  15. StreamSubscription<SyncStatusUpdate> _firstImportEvent;
  16. int _currentPage = 0;
  17. final PageController _pageController = PageController(
  18. initialPage: 0,
  19. );
  20. final List<String> _messages = [
  21. "web.ente.io has a slick uploader",
  22. "we have preserved over 500,000 files so far",
  23. "all our apps are open source",
  24. "our encryption protocols have been reviewed by engineers at Google, Apple, Amazon, and Facebook",
  25. "you can share files and folders with your loved ones, end-to-end encrypted",
  26. "our mobile apps run in the background to encrypt and backup new photos you take",
  27. "we use Xchacha20Poly1305 to safely encrypt your data",
  28. "one of our data centers is in a fall out shelter 25m underground",
  29. ];
  30. @override
  31. void initState() {
  32. super.initState();
  33. _firstImportEvent =
  34. Bus.instance.on<SyncStatusUpdate>().listen((event) async {
  35. if (mounted &&
  36. event.status == SyncStatus.completed_first_gallery_import) {
  37. if (LocalSyncService.instance.hasGrantedLimitedPermissions()) {
  38. // Do nothing, let HomeWidget refresh
  39. } else {
  40. routeToPage(
  41. context,
  42. BackupFolderSelectionPage(
  43. shouldSelectAll: true,
  44. buttonText: "start backup",
  45. ));
  46. }
  47. }
  48. });
  49. Timer.periodic(Duration(seconds: 5), (Timer timer) {
  50. if (!mounted) {
  51. return;
  52. }
  53. if (_currentPage < _messages.length - 1) {
  54. _currentPage++;
  55. } else {
  56. _currentPage = 0;
  57. }
  58. _pageController.animateToPage(
  59. _currentPage,
  60. duration: Duration(milliseconds: 300),
  61. curve: Curves.easeIn,
  62. );
  63. });
  64. }
  65. @override
  66. void dispose() {
  67. _firstImportEvent.cancel();
  68. super.dispose();
  69. }
  70. @override
  71. Widget build(BuildContext context) {
  72. return Scaffold(
  73. body: Center(
  74. child: Column(
  75. mainAxisAlignment: MainAxisAlignment.center,
  76. crossAxisAlignment: CrossAxisAlignment.center,
  77. children: [
  78. LoadingBouncingGrid.square(
  79. inverted: true,
  80. backgroundColor: Theme.of(context).buttonColor,
  81. size: 64,
  82. ),
  83. Padding(padding: const EdgeInsets.all(20.0)),
  84. Text(
  85. "loading your gallery...",
  86. style: TextStyle(
  87. fontSize: 16,
  88. ),
  89. ),
  90. Padding(padding: EdgeInsets.all(10)),
  91. Text(
  92. "this might take upto 30 seconds 🐣",
  93. style: TextStyle(color: Colors.white.withOpacity(0.3)),
  94. ),
  95. Padding(padding: const EdgeInsets.all(70)),
  96. Text(
  97. "did you know?",
  98. style: TextStyle(
  99. fontSize: 16,
  100. color: Theme.of(context).buttonColor,
  101. ),
  102. ),
  103. Padding(padding: EdgeInsets.all(8)),
  104. SizedBox(
  105. height: 80,
  106. child: PageView.builder(
  107. scrollDirection: Axis.vertical,
  108. controller: _pageController,
  109. itemBuilder: (context, index) {
  110. return _getMessage(_messages[index]);
  111. },
  112. itemCount: _messages.length,
  113. physics: NeverScrollableScrollPhysics(),
  114. ),
  115. ),
  116. ],
  117. ),
  118. ),
  119. );
  120. }
  121. Widget _getMessage(String text) {
  122. return Padding(
  123. padding: const EdgeInsets.only(left: 24, right: 24),
  124. child: Text(
  125. text,
  126. textAlign: TextAlign.center,
  127. style: TextStyle(
  128. color: Colors.white.withOpacity(0.7),
  129. height: 1.5,
  130. ),
  131. ),
  132. );
  133. }
  134. }