Browse Source

Add happy path

Vishnu Mohandas 4 years ago
parent
commit
99ede8f687

+ 3 - 0
lib/events/permission_granted_event.dart

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

+ 22 - 1
lib/services/sync_service.dart

@@ -12,6 +12,7 @@ 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/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/models/file_type.dart';
@@ -42,6 +43,7 @@ class SyncService {
   SyncStatusUpdate _lastSyncStatusEvent;
 
   static const kDbUpdationTimeKey = "db_updation_time";
+  static const kHasGrantedPermissionsKey = "has_granted_permissions";
   static const kLastBackgroundUploadDetectedTime =
       "last_background_upload_detected_time";
   static const kDiffLimit = 200;
@@ -156,7 +158,27 @@ class SyncService {
     return _lastSyncStatusEvent;
   }
 
+  bool hasGrantedPermissions() {
+    return _prefs.containsKey(kHasGrantedPermissionsKey) &&
+        _prefs.getBool(kHasGrantedPermissionsKey);
+  }
+
+  Future<void> onPermissionGranted() async {
+    await _prefs.setBool(kHasGrantedPermissionsKey, true);
+    Bus.instance.fire(PermissionGrantedEvent());
+    _doSync();
+  }
+
   Future<void> _doSync() async {
+    await _syncWithDevice();
+    await syncWithRemote();
+  }
+
+  Future<void> _syncWithDevice() async {
+    if (!_prefs.containsKey(kHasGrantedPermissionsKey)) {
+      _logger.info("Skipping local sync since permission has not been granted");
+      return;
+    }
     final existingLocalFileIDs = await _db.getExistingLocalFileIDs();
     final syncStartTime = DateTime.now().microsecondsSinceEpoch;
     if (_isBackground) {
@@ -187,7 +209,6 @@ class SyncService {
       }
       await _loadAndStorePhotos(startTime, syncStartTime, existingLocalFileIDs);
     }
-    await syncWithRemote();
   }
 
   Future<void> _loadAndStorePhotos(

+ 55 - 0
lib/ui/grant_permissions_widget.dart

@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+import 'package:logging/logging.dart';
+import 'package:photo_manager/photo_manager.dart';
+import 'package:photos/services/sync_service.dart';
+
+class GrantPermissionsWidget extends StatelessWidget {
+  final _logger = Logger("GrantPermissionsWidget");
+  
+  @override
+  Widget build(BuildContext context) {
+    return Center(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          Padding(
+            padding: const EdgeInsets.all(32),
+            child: Text(
+              "ente needs your permission to load and display your gallery",
+              textAlign: TextAlign.center,
+              style: TextStyle(
+                height: 1.4,
+              ),
+            ),
+          ),
+          Container(
+            width: double.infinity,
+            height: 64,
+            padding: const EdgeInsets.fromLTRB(80, 0, 80, 0),
+            child: RaisedButton(
+              child: Text(
+                "grant permission",
+                style: TextStyle(
+                  fontWeight: FontWeight.bold,
+                  fontSize: 18,
+                  letterSpacing: 1.0,
+                ),
+                textAlign: TextAlign.center,
+              ),
+              onPressed: () async {
+                final granted = await PhotoManager.requestPermission();
+                if (granted) {
+                  SyncService.instance.onPermissionGranted();
+                }
+              },
+              shape: RoundedRectangleBorder(
+                borderRadius: BorderRadius.circular(10.0),
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 13 - 3
lib/ui/home_widget.dart

@@ -7,6 +7,7 @@ import 'package:flutter/widgets.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
+import 'package:photos/events/permission_granted_event.dart';
 import 'package:photos/events/tab_changed_event.dart';
 import 'package:photos/models/filters/important_items_filter.dart';
 import 'package:photos/models/file.dart';
@@ -16,6 +17,7 @@ import 'package:photos/services/sync_service.dart';
 import 'package:photos/ui/collections_gallery_widget.dart';
 import 'package:photos/ui/extents_page_view.dart';
 import 'package:photos/ui/gallery.dart';
+import 'package:photos/ui/grant_permissions_widget.dart';
 import 'package:photos/ui/loading_photos_widget.dart';
 import 'package:photos/ui/loading_widget.dart';
 import 'package:photos/ui/memories_widget.dart';
@@ -51,6 +53,7 @@ class _HomeWidgetState extends State<HomeWidget> {
 
   StreamSubscription<LocalPhotosUpdatedEvent> _photosUpdatedEvent;
   StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
+  StreamSubscription<PermissionGrantedEvent> _permissionGrantedEvent;
 
   @override
   void initState() {
@@ -75,6 +78,10 @@ class _HomeWidgetState extends State<HomeWidget> {
         );
       }
     });
+    _permissionGrantedEvent =
+        Bus.instance.on<PermissionGrantedEvent>().listen((event) {
+      setState(() {});
+    });
     _initDeepLinks();
     super.initState();
   }
@@ -91,9 +98,11 @@ class _HomeWidgetState extends State<HomeWidget> {
         children: [
           ExtentsPageView(
             children: [
-              SyncService.instance.hasScannedDisk()
-                  ? _getMainGalleryWidget()
-                  : LoadingPhotosWidget(),
+              SyncService.instance.hasGrantedPermissions()
+                  ? (SyncService.instance.hasScannedDisk()
+                      ? _getMainGalleryWidget()
+                      : LoadingPhotosWidget())
+                  : GrantPermissionsWidget(),
               _deviceFolderGalleryWidget,
               _sharedCollectionGallery,
             ],
@@ -254,6 +263,7 @@ class _HomeWidgetState extends State<HomeWidget> {
   void dispose() {
     _tabChangedEventSubscription.cancel();
     _photosUpdatedEvent.cancel();
+    _permissionGrantedEvent.cancel();
     super.dispose();
   }
 }