瀏覽代碼

Setup happy paths

Vishnu Mohandas 4 年之前
父節點
當前提交
6922b35efd

+ 0 - 3
lib/events/first_import_succeeded_event.dart

@@ -1,3 +0,0 @@
-import 'package:photos/events/event.dart';
-
-class FirstImportSucceededEvent extends Event {}

+ 0 - 3
lib/events/permission_granted_event.dart

@@ -1,3 +0,0 @@
-import 'package:photos/events/event.dart';
-
-class PermissionGrantedEvent extends Event {}

+ 5 - 11
lib/services/sync_service.dart

@@ -8,9 +8,7 @@ import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/collection_updated_event.dart';
-import 'package:photos/events/first_import_succeeded_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
-import 'package:photos/events/permission_granted_event.dart';
 import 'package:photos/events/sync_status_update_event.dart';
 import 'package:photos/events/subscription_purchased_event.dart';
 import 'package:photos/events/trigger_logout_event.dart';
@@ -43,6 +41,7 @@ class SyncService {
   int _completedUploads = 0;
 
   static const kDbUpdationTimeKey = "db_updation_time";
+  static const kHasCompletedFirstImportKey = "has_completed_firstImport";
   static const kHasGrantedPermissionsKey = "has_granted_permissions";
   static const kLastBackgroundUploadDetectedTime =
       "last_background_upload_detected_time";
@@ -154,8 +153,8 @@ class SyncService {
     return _syncStopRequested;
   }
 
-  bool hasScannedDisk() {
-    return _prefs.containsKey(kDbUpdationTimeKey);
+  bool hasCompletedFirstImport() {
+    return _prefs.getBool(kHasCompletedFirstImportKey) ?? false;
   }
 
   bool isSyncInProgress() {
@@ -167,13 +166,11 @@ class SyncService {
   }
 
   bool hasGrantedPermissions() {
-    return _prefs.containsKey(kHasGrantedPermissionsKey) &&
-        _prefs.getBool(kHasGrantedPermissionsKey);
+    return _prefs.getBool(kHasGrantedPermissionsKey) ?? false;
   }
 
   Future<void> onPermissionGranted() async {
     await _prefs.setBool(kHasGrantedPermissionsKey, true);
-    Bus.instance.fire(PermissionGrantedEvent());
     _doSync();
   }
 
@@ -231,6 +228,7 @@ class SyncService {
         toTime = DateTime(toYear).microsecondsSinceEpoch;
       }
       await _loadAndStorePhotos(startTime, syncStartTime, existingLocalFileIDs);
+      _prefs.setBool(kHasCompletedFirstImportKey, true);
       Bus.instance
           .fire(SyncStatusUpdate(SyncStatus.completed_first_gallery_import));
     }
@@ -265,11 +263,7 @@ class SyncService {
       _logger.info("Inserted " + files.length.toString() + " files.");
       Bus.instance.fire(LocalPhotosUpdatedEvent(allFiles));
     }
-    bool isFirstImport = !_prefs.containsKey(kDbUpdationTimeKey);
     await _prefs.setInt(kDbUpdationTimeKey, toTime);
-    if (isFirstImport) {
-      Bus.instance.fire(FirstImportSucceededEvent());
-    }
   }
 
   Future<void> syncWithRemote({bool silently = false}) async {

+ 20 - 0
lib/ui/backup_folder_selection_widget.dart

@@ -10,6 +10,26 @@ import 'package:photos/models/file.dart';
 import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/ui/thumbnail_widget.dart';
 
+void showBackupFolderSelectionDialog(BuildContext context) {
+  Future.delayed(
+    Duration.zero,
+    () => showDialog(
+      context: context,
+      builder: (context) {
+        return WillPopScope(
+          onWillPop: () async => false,
+          child: AlertDialog(
+            content: const BackupFolderSelectionWidget("start backup"),
+            backgroundColor: Colors.black.withOpacity(0.8),
+          ),
+        );
+      },
+      barrierDismissible: false,
+      barrierColor: Colors.black.withOpacity(0.85),
+    ),
+  );
+}
+
 class BackupFolderSelectionWidget extends StatefulWidget {
   final String buttonText;
 

+ 39 - 1
lib/ui/grant_permissions_widget.dart

@@ -1,11 +1,48 @@
+import 'dart:async';
+
 import 'package:flutter/material.dart';
 import 'package:logging/logging.dart';
 import 'package:photo_manager/photo_manager.dart';
+import 'package:photos/core/event_bus.dart';
+import 'package:photos/events/sync_status_update_event.dart';
 import 'package:photos/services/sync_service.dart';
+import 'package:photos/ui/backup_folder_selection_widget.dart';
+import 'package:photos/ui/progress_dialog.dart';
+import 'package:photos/utils/dialog_util.dart';
+
+class GrantPermissionsWidget extends StatefulWidget {
+  @override
+  _GrantPermissionsWidgetState createState() => _GrantPermissionsWidgetState();
+}
 
-class GrantPermissionsWidget extends StatelessWidget {
+class _GrantPermissionsWidgetState extends State<GrantPermissionsWidget> {
   final _logger = Logger("GrantPermissionsWidget");
 
+  ProgressDialog _dialog;
+  StreamSubscription<SyncStatusUpdate> _firstImportEvent;
+
+  @override
+  void initState() {
+    super.initState();
+    _dialog = createProgressDialog(
+        context, "hang on tight, your photos will be loaded in a jiffy! 🐣");
+
+    _firstImportEvent =
+        Bus.instance.on<SyncStatusUpdate>().listen((event) async {
+      if (mounted &&
+          event.status == SyncStatus.completed_first_gallery_import) {
+        await _dialog.hide();
+        showBackupFolderSelectionDialog(context);
+      }
+    });
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _firstImportEvent.cancel();
+  }
+
   @override
   Widget build(BuildContext context) {
     return Center(
@@ -41,6 +78,7 @@ class GrantPermissionsWidget extends StatelessWidget {
               onPressed: () async {
                 final granted = await PhotoManager.requestPermission();
                 if (granted) {
+                  await _dialog.show();
                   SyncService.instance.onPermissionGranted();
                 }
               },

+ 38 - 70
lib/ui/home_widget.dart

@@ -10,9 +10,7 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/backup_folders_updated_event.dart';
-import 'package:photos/events/first_import_succeeded_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
-import 'package:photos/events/permission_granted_event.dart';
 import 'package:photos/events/subscription_purchased_event.dart';
 import 'package:photos/events/tab_changed_event.dart';
 import 'package:photos/events/trigger_logout_event.dart';
@@ -26,7 +24,6 @@ import 'package:photos/ui/extents_page_view.dart';
 import 'package:photos/ui/gallery.dart';
 import 'package:photos/ui/gallery_app_bar_widget.dart';
 import 'package:photos/ui/grant_permissions_widget.dart';
-import 'package:photos/ui/loading_photos_widget.dart';
 import 'package:photos/ui/memories_widget.dart';
 import 'package:photos/services/user_service.dart';
 import 'package:photos/ui/nav_bar.dart';
@@ -58,9 +55,7 @@ class _HomeWidgetState extends State<HomeWidget> {
   Widget _headerWidgetWithSettingsButton;
 
   StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
-  StreamSubscription<PermissionGrantedEvent> _permissionGrantedEvent;
   StreamSubscription<SubscriptionPurchasedEvent> _subscriptionPurchaseEvent;
-  StreamSubscription<FirstImportSucceededEvent> _firstImportEvent;
   StreamSubscription<TriggerLogoutEvent> _triggerLogoutEvent;
   StreamSubscription<UserLoggedOutEvent> _loggedOutEvent;
   StreamSubscription<BackupFoldersUpdatedEvent> _backupFoldersUpdatedEvent;
@@ -92,20 +87,9 @@ class _HomeWidgetState extends State<HomeWidget> {
         );
       }
     });
-    _permissionGrantedEvent =
-        Bus.instance.on<PermissionGrantedEvent>().listen((event) {
-      setState(() {});
-    });
     _subscriptionPurchaseEvent =
         Bus.instance.on<SubscriptionPurchasedEvent>().listen((event) {
       setState(() {});
-      if (Configuration.instance.getPathsToBackUp().isEmpty) {
-        _showBackupFolderSelectionDialog();
-      }
-    });
-    _firstImportEvent =
-        Bus.instance.on<FirstImportSucceededEvent>().listen((event) {
-      setState(() {});
     });
     _triggerLogoutEvent =
         Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
@@ -149,7 +133,7 @@ class _HomeWidgetState extends State<HomeWidget> {
     if (Configuration.instance.getPathsToBackUp().isEmpty &&
         Configuration.instance.hasConfiguredAccount() &&
         BillingService.instance.hasActiveSubscription()) {
-      _showBackupFolderSelectionDialog();
+      showBackupFolderSelectionDialog(context);
     }
     super.initState();
   }
@@ -164,33 +148,7 @@ class _HomeWidgetState extends State<HomeWidget> {
           preferredSize: Size.fromHeight(0),
           child: Container(),
         ),
-        body: Stack(
-          children: [
-            ExtentsPageView(
-              children: [
-                SyncService.instance.hasGrantedPermissions()
-                    ? (SyncService.instance.hasScannedDisk()
-                        ? _getMainGalleryWidget()
-                        : const LoadingPhotosWidget())
-                    : GrantPermissionsWidget(),
-                _deviceFolderGalleryWidget,
-                _sharedCollectionGallery,
-              ],
-              onPageChanged: (page) {
-                Bus.instance.fire(TabChangedEvent(
-                  page,
-                  TabChangedEventSource.page_view,
-                ));
-              },
-              physics: NeverScrollableScrollPhysics(),
-              controller: _pageController,
-            ),
-            Align(
-              alignment: Alignment.bottomCenter,
-              child: _buildBottomNavigationBar(),
-            ),
-          ],
-        ),
+        body: _getBody(),
       ),
       onWillPop: () async {
         if (Platform.isAndroid) {
@@ -203,6 +161,39 @@ class _HomeWidgetState extends State<HomeWidget> {
     );
   }
 
+  Widget _getBody() {
+    if (!Configuration.instance.hasConfiguredAccount()) {
+      return SignInHeader();
+    }
+    if (!SyncService.instance.hasGrantedPermissions()) {
+      return GrantPermissionsWidget();
+    }
+
+    return Stack(
+      children: [
+        ExtentsPageView(
+          children: [
+            _getMainGalleryWidget(),
+            _deviceFolderGalleryWidget,
+            _sharedCollectionGallery,
+          ],
+          onPageChanged: (page) {
+            Bus.instance.fire(TabChangedEvent(
+              page,
+              TabChangedEventSource.page_view,
+            ));
+          },
+          physics: NeverScrollableScrollPhysics(),
+          controller: _pageController,
+        ),
+        Align(
+          alignment: Alignment.bottomCenter,
+          child: _buildBottomNavigationBar(),
+        ),
+      ],
+    );
+  }
+
   Future<bool> _initDeepLinks() async {
     // Platform messages may fail, so we use a try/catch PlatformException.
     try {
@@ -255,8 +246,9 @@ class _HomeWidgetState extends State<HomeWidget> {
               creationStartTime, creationEndTime, importantPaths.toList(),
               limit: limit, asc: asc);
         } else {
-          return FilesDB.instance
-              .getAllFiles(creationStartTime, creationEndTime, limit: limit, asc: asc);
+          return FilesDB.instance.getAllFiles(
+              creationStartTime, creationEndTime,
+              limit: limit, asc: asc);
         }
       },
       reloadEvent: Bus.instance.on<LocalPhotosUpdatedEvent>(),
@@ -323,32 +315,10 @@ class _HomeWidgetState extends State<HomeWidget> {
     );
   }
 
-  void _showBackupFolderSelectionDialog() {
-    Future.delayed(
-      Duration.zero,
-      () => showDialog(
-        context: context,
-        builder: (context) {
-          return WillPopScope(
-            onWillPop: () async => false,
-            child: AlertDialog(
-              content: const BackupFolderSelectionWidget("start backup"),
-              backgroundColor: Colors.black.withOpacity(0.8),
-            ),
-          );
-        },
-        barrierDismissible: false,
-        barrierColor: Colors.black.withOpacity(0.85),
-      ),
-    );
-  }
-
   @override
   void dispose() {
     _tabChangedEventSubscription.cancel();
-    _permissionGrantedEvent.cancel();
     _subscriptionPurchaseEvent.cancel();
-    _firstImportEvent.cancel();
     _triggerLogoutEvent.cancel();
     _loggedOutEvent.cancel();
     _backupFoldersUpdatedEvent.cancel();
@@ -397,7 +367,6 @@ class _HomePageAppBarState extends State<HomePageAppBar> {
 
 class HeaderWidget extends StatelessWidget {
   static const _memoriesWidget = const MemoriesWidget();
-  static const _signInHeader = const SignInHeader();
   static const _syncIndicator = const SyncIndicator();
 
   const HeaderWidget({
@@ -408,7 +377,6 @@ class HeaderWidget extends StatelessWidget {
   Widget build(BuildContext context) {
     Logger("Header").info("Building header widget");
     const list = [
-      _signInHeader,
       _syncIndicator,
       _memoriesWidget,
     ];

+ 2 - 1
lib/ui/subscription_page.dart

@@ -72,7 +72,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
             );
             await InAppPurchaseConnection.instance.completePurchase(purchase);
             Bus.instance.fire(SubscriptionPurchasedEvent());
-            String text = "your photos and videos will now be backed up";
+            String text = "thank you for subscribing!";
             if (!widget.isOnboarding) {
               final isUpgrade = _hasActiveSubscription &&
                   newSubscription.storage > _currentSubscription.storage;
@@ -458,6 +458,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
                     ),
                     onPressed: () {
                       if (widget.isOnboarding) {
+                        showToast("thank you for signing up!");
                         Bus.instance.fire(SubscriptionPurchasedEvent());
                       }
                       Navigator.of(context, rootNavigator: true).pop('dialog');