diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fe1475cd8..a5df1bcca 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3,6 +3,8 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) + - local_image_provider (0.0.1): + - Flutter - path_provider (0.0.1): - Flutter - path_provider_macos (0.0.1): @@ -21,6 +23,7 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) + - local_image_provider (from `.symlinks/plugins/local_image_provider/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`) - photo_manager (from `.symlinks/plugins/photo_manager/ios`) @@ -36,6 +39,8 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: :path: Flutter + local_image_provider: + :path: ".symlinks/plugins/local_image_provider/ios" path_provider: :path: ".symlinks/plugins/path_provider/ios" path_provider_macos: @@ -54,6 +59,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: 0e3d915762c693b495b44d77113d4970485de6ec FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + local_image_provider: cf979b81bc1cacc81867d3511a1b6b7216411e93 path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0 photo_manager: f7c619c2cc8c2adb8d85c63363babac477de9c67 diff --git a/lib/main.dart b/lib/main.dart index d4081dd86..6cad888d6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:myapp/photo_loader.dart'; import 'package:myapp/photo_provider.dart'; import 'package:myapp/photo_sync_manager.dart'; import 'package:myapp/ui/detail_page.dart'; +import 'package:myapp/ui/loading_widget.dart'; import 'package:provider/provider.dart'; import 'package:myapp/ui/gallery_page.dart'; @@ -38,7 +39,7 @@ class MyApp extends StatelessWidget { } class MyApp2 extends StatelessWidget { - final PhotoLoader photoLoader = PhotoLoader(); + final PhotoLoader photoLoader = PhotoLoader.instance; @override Widget build(BuildContext context) { @@ -48,16 +49,18 @@ class MyApp2 extends StatelessWidget { builder: (context, snapshot) { Widget body; if (snapshot.hasData) { - body = GridView.builder( - itemBuilder: _buildItem, - itemCount: snapshot.data.length, - gridDelegate: - SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4), - ); + body = ChangeNotifierProvider.value( + value: photoLoader, + child: GridView.builder( + itemBuilder: _buildItem, + itemCount: snapshot.data.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4), + )); } else if (snapshot.hasError) { body = Text("Error!"); } else { - body = Text("Loading"); + body = loadWidget; } return MaterialApp( title: title, @@ -72,6 +75,7 @@ class MyApp2 extends StatelessWidget { } Widget _buildItem(BuildContext context, int index) { + logger.i("Building item"); var file = File(photoLoader.getPhotos()[index].localPath); return GestureDetector( onTap: () async { diff --git a/lib/photo_loader.dart b/lib/photo_loader.dart index d30f32bbc..ca0ab95a6 100644 --- a/lib/photo_loader.dart +++ b/lib/photo_loader.dart @@ -1,11 +1,15 @@ +import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; import 'package:myapp/db/db_helper.dart'; import 'package:myapp/models/photo.dart'; -class PhotoLoader { +class PhotoLoader extends ChangeNotifier { final logger = Logger(); List _photos; + PhotoLoader._privateConstructor(); + static final PhotoLoader instance = PhotoLoader._privateConstructor(); + List getPhotos() { return _photos; } @@ -16,4 +20,10 @@ class PhotoLoader { logger.i("Imported photo size: " + _photos.length.toString()); return _photos; } + + void reloadPhotos() async { + await loadPhotos(); + logger.i("Reloading..."); + notifyListeners(); + } } \ No newline at end of file diff --git a/lib/photo_sync_manager.dart b/lib/photo_sync_manager.dart index 24c9bd42b..b3a72219b 100644 --- a/lib/photo_sync_manager.dart +++ b/lib/photo_sync_manager.dart @@ -1,5 +1,6 @@ import 'package:logger/logger.dart'; import 'package:myapp/db/db_helper.dart'; +import 'package:myapp/photo_loader.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photo_manager/photo_manager.dart'; @@ -10,7 +11,7 @@ import 'package:myapp/models/photo.dart'; class PhotoSyncManager { final logger = Logger(); final dio = Dio(); - final endpoint = "http://192.168.0.106:8080"; + final endpoint = "http://172.20.10.6:8080"; final user = "umbu"; static final lastSyncTimestampKey = "last_sync_timestamp_0"; @@ -39,15 +40,19 @@ class PhotoSyncManager { assets.sort((first, second) => second .modifiedDateTime.millisecondsSinceEpoch .compareTo(first.modifiedDateTime.millisecondsSinceEpoch)); + var uploadedAssetCount = 0; for (AssetEntity asset in assets) { - DatabaseHelper.instance - .containsPath((await asset.originFile).path) - .then((containsPath) async { - if (!containsPath) { - var response = await _uploadFile(asset); - prefs.setInt(lastSyncTimestampKey, response.syncTimestamp); - } - }); + // TODO: Fix me + if (uploadedAssetCount == 100) { + return; + } + var containsPath = await DatabaseHelper.instance + .containsPath((await asset.originFile).path); + if (!containsPath) { + var response = await _uploadFile(asset); + prefs.setInt(lastSyncTimestampKey, response.syncTimestamp); + uploadedAssetCount++; + } } } @@ -56,7 +61,8 @@ class PhotoSyncManager { "user": user, "lastSyncTimestamp": lastSyncTimestamp }); - var externalPath = (await getExternalStorageDirectory()).path; + logger.i(response.toString()); + var externalPath = (await getApplicationDocumentsDirectory()).path; logger.i("External path: " + externalPath); var path = externalPath + "/photos/"; @@ -67,7 +73,7 @@ class PhotoSyncManager { await dio.download(endpoint + photo.url, path + basename(photo.url)); photo.hash = _getHash(photo); photo.localPath = path + basename(photo.url); - DatabaseHelper.instance.insertPhoto(photo); + insertPhotoToDB(photo); prefs.setInt(lastSyncTimestampKey, photo.syncTimestamp); logger.i("Downloaded " + photo.url + " to " + path); } @@ -85,7 +91,7 @@ class PhotoSyncManager { var photo = Photo.fromJson(response.data); photo.hash = _getHash(photo); photo.localPath = path; - DatabaseHelper.instance.insertPhoto(photo); + insertPhotoToDB(photo); return photo; } @@ -93,4 +99,10 @@ class PhotoSyncManager { // TODO: Compute hash return "hash"; } + + Future insertPhotoToDB(Photo photo) async { + logger.i("Inserting to DB"); + await DatabaseHelper.instance.insertPhoto(photo); + PhotoLoader.instance.reloadPhotos(); + } } diff --git a/lib/ui/detail_page.dart b/lib/ui/detail_page.dart index 18addb620..55aec494b 100644 --- a/lib/ui/detail_page.dart +++ b/lib/ui/detail_page.dart @@ -17,18 +17,23 @@ class _DetailPageState extends State { return Scaffold( body: Center( child: Container( - child: _buildContent(), + child: _buildContent(context), ), ), ); } - Widget _buildContent() { - return Hero( - tag: 'photo_' + widget.file.path, - child: Image.file( - widget.file, - filterQuality: FilterQuality.low, + Widget _buildContent(BuildContext context) { + return GestureDetector( + onVerticalDragUpdate: (details) { + Navigator.pop(context); + }, + child: Hero( + tag: 'photo_' + widget.file.path, + child: Image.file( + widget.file, + filterQuality: FilterQuality.low, + ), ), ); }