diff --git a/lib/db/db_helper.dart b/lib/db/db_helper.dart index b1dc021ea..7e4fda016 100644 --- a/lib/db/db_helper.dart +++ b/lib/db/db_helper.dart @@ -11,6 +11,7 @@ class DatabaseHelper { static final table = 'photos'; + static final columnLocalId = 'local_id'; static final columnLocalPath = 'local_path'; static final columnThumbnailPath = 'thumbnail_path'; static final columnPath = 'path'; @@ -42,6 +43,7 @@ class DatabaseHelper { Future _onCreate(Database db, int version) async { await db.execute(''' CREATE TABLE $table ( + $columnLocalId TEXT, $columnLocalPath TEXT NOT NULL, $columnThumbnailPath TEXT NOT NULL, $columnPath TEXT, @@ -123,6 +125,7 @@ class DatabaseHelper { Map _getRowForPhoto(Photo photo) { var row = new Map(); + row[columnLocalId] = photo.localId; row[columnLocalPath] = photo.localPath; row[columnThumbnailPath] = photo.thumbnailPath; row[columnPath] = photo.path; diff --git a/lib/models/photo.dart b/lib/models/photo.dart index c682bcf60..9e27f8b76 100644 --- a/lib/models/photo.dart +++ b/lib/models/photo.dart @@ -1,12 +1,10 @@ import 'dart:io'; import 'package:crypto/crypto.dart'; -import 'package:flutter/foundation.dart'; -import 'package:image/image.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:photo_manager/photo_manager.dart'; class Photo { + String localId; String path; String localPath; String thumbnailPath; @@ -22,7 +20,8 @@ class Photo { syncTimestamp = json["syncTimestamp"]; Photo.fromRow(Map row) - : localPath = row["local_path"], + : localId = row["local_id"], + localPath = row["local_path"], thumbnailPath = row["thumbnail_path"], path = row["path"], hash = row["hash"], @@ -33,34 +32,14 @@ class Photo { static Future fromAsset(AssetEntity asset) async { Photo photo = Photo(); var file = (await asset.originFile); + photo.localId = asset.id; photo.localPath = file.path; photo.hash = getHash(file); photo.thumbnailPath = file.path; return photo; } - static Future setThumbnail(Photo photo) async { - var externalPath = (await getApplicationDocumentsDirectory()).path; - var thumbnailPath = - externalPath + "/photos/thumbnails/" + photo.hash + ".thumbnail"; - var args = Map(); - args["assetPath"] = photo.localPath; - args["thumbnailPath"] = thumbnailPath; - photo.thumbnailPath = thumbnailPath; - return compute(getThumbnailPath, args).then((value) => photo); - } - static String getHash(File file) { return sha256.convert(file.readAsBytesSync()).toString(); } } - -Future getThumbnailPath(Map args) async { - return File(args["thumbnailPath"]) - ..writeAsBytes(_getThumbnail(args["assetPath"])); -} - -List _getThumbnail(String path) { - Image image = decodeImage(File(path).readAsBytesSync()); - return encodePng(copyResize(image, width: 250)); -} diff --git a/lib/ui/face_search_results_page.dart b/lib/ui/face_search_results_page.dart index 83f2a94be..5aeb3474a 100644 --- a/lib/ui/face_search_results_page.dart +++ b/lib/ui/face_search_results_page.dart @@ -71,7 +71,7 @@ class FaceSearchResultsPage extends StatelessWidget { future: DatabaseHelper.instance.getPhotoByPath(path), builder: (_, snapshot) { if (snapshot.hasData) { - return ImageWidget(path: snapshot.data.thumbnailPath); + return ImageWidget(snapshot.data); } else if (snapshot.hasError) { return Container( margin: EdgeInsets.all(2), diff --git a/lib/ui/gallery.dart b/lib/ui/gallery.dart index 6d7a7e680..30d7ae32b 100644 --- a/lib/ui/gallery.dart +++ b/lib/ui/gallery.dart @@ -68,7 +68,7 @@ class _GalleryState extends State { }, child: Padding( padding: const EdgeInsets.all(1.0), - child: ImageWidget(path: photo.thumbnailPath), + child: ImageWidget(photo), ), ); } diff --git a/lib/ui/image_widget.dart b/lib/ui/image_widget.dart index fd324a84f..07ec88f39 100644 --- a/lib/ui/image_widget.dart +++ b/lib/ui/image_widget.dart @@ -1,17 +1,19 @@ -import 'dart:io'; +import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:myapp/core/lru_map.dart'; +import 'package:myapp/models/photo.dart'; import 'package:myapp/photo_loader.dart'; import 'package:myapp/ui/loading_widget.dart'; +import 'package:photo_manager/photo_manager.dart'; import 'package:provider/provider.dart'; class ImageWidget extends StatefulWidget { - final String path; + final Photo photo; - const ImageWidget({ + const ImageWidget( + this.photo, { Key key, - this.path, }) : super(key: key); @override _ImageWidgetState createState() => _ImageWidgetState(); @@ -22,7 +24,7 @@ class _ImageWidgetState extends State { @override Widget build(BuildContext context) { - final path = widget.path; + final path = widget.photo.localPath; final size = 124; final cachedImage = ImageLruCache.getData(path, size); @@ -31,12 +33,15 @@ class _ImageWidgetState extends State { if (cachedImage != null) { image = cachedImage; } else { - image = FutureBuilder( - future: _buildImageWidget(path, size), + image = FutureBuilder( + future: + AssetEntity(id: widget.photo.localId).thumbDataWithSize(size, size), builder: (context, snapshot) { if (snapshot.hasData) { - ImageLruCache.setData(path, size, snapshot.data); - return snapshot.data; + Image image = Image.memory(snapshot.data, + width: 124, height: 124, fit: BoxFit.cover); + ImageLruCache.setData(path, size, image); + return image; } else { return loadWidget; } @@ -47,15 +52,10 @@ class _ImageWidgetState extends State { return image; } - Future _buildImageWidget(String path, num size) async { - return Image.file(File(path), - width: size.toDouble(), height: size.toDouble(), fit: BoxFit.cover); - } - @override void didUpdateWidget(ImageWidget oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.path != oldWidget.path) { + if (widget.photo.localPath != oldWidget.photo.localPath) { setState(() {}); } }