Add some interaction to go back
This commit is contained in:
parent
e452555632
commit
22d3f2c9ed
5 changed files with 65 additions and 28 deletions
|
@ -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
|
||||
|
|
|
@ -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<PhotoLoader>.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 {
|
||||
|
|
|
@ -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<Photo> _photos;
|
||||
|
||||
PhotoLoader._privateConstructor();
|
||||
static final PhotoLoader instance = PhotoLoader._privateConstructor();
|
||||
|
||||
List<Photo> 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();
|
||||
}
|
||||
}
|
|
@ -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<void> insertPhotoToDB(Photo photo) async {
|
||||
logger.i("Inserting to DB");
|
||||
await DatabaseHelper.instance.insertPhoto(photo);
|
||||
PhotoLoader.instance.reloadPhotos();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,18 +17,23 @@ class _DetailPageState extends State<DetailPage> {
|
|||
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,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue