diff --git a/lib/db/photo_db.dart b/lib/db/file_db.dart similarity index 87% rename from lib/db/photo_db.dart rename to lib/db/file_db.dart index cf626cb8a..cf1e256f8 100644 --- a/lib/db/photo_db.dart +++ b/lib/db/file_db.dart @@ -29,8 +29,9 @@ class FileDB { static final columnRemotePath = 'remote_path'; static final columnThumbnailPath = 'thumbnail_path'; static final columnIsDeleted = 'is_deleted'; - static final columnCreateTimestamp = 'create_timestamp'; - static final columnUpdateTimestamp = 'update_timestamp'; + static final columnCreationTime = 'creation_time'; + static final columnModificationTime = 'modification_time'; + static final columnUpdationTime = 'updation_time'; // make this a singleton class FileDB._privateConstructor(); @@ -69,8 +70,9 @@ class FileDB { $columnRemotePath TEXT, $columnThumbnailPath TEXT, $columnIsDeleted INTEGER DEFAULT 0, - $columnCreateTimestamp TEXT NOT NULL, - $columnUpdateTimestamp TEXT + $columnCreationTime TEXT NOT NULL, + $columnModificationTime TEXT NOT NULL, + $columnUpdationTime TEXT ) '''); } @@ -100,7 +102,7 @@ class FileDB { final results = await db.query( table, where: '$columnLocalId IS NOT NULL AND $columnIsDeleted = 0', - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', ); return _convertToFiles(results); } @@ -111,7 +113,7 @@ class FileDB { table, where: '$columnLocalId IS NOT NULL AND $columnFileType = 1 AND $columnIsDeleted = 0', - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', ); return _convertToFiles(results); } @@ -122,7 +124,7 @@ class FileDB { table, where: '$columnRemoteFolderId = ? AND $columnIsDeleted = 0', whereArgs: [folderId], - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', ); return _convertToFiles(results); } @@ -132,7 +134,7 @@ class FileDB { final results = await db.query( table, where: '$columnIsDeleted = 1', - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', ); return _convertToFiles(results); } @@ -142,25 +144,26 @@ class FileDB { final results = await db.query( table, where: '$columnUploadedFileId IS NULL', - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', ); return _convertToFiles(results); } - Future getMatchingFile( - String localId, String title, String deviceFolder, int createTimestamp, + Future getMatchingFile(String localId, String title, + String deviceFolder, int creationTime, int modificationTime, {String alternateTitle}) async { final db = await instance.database; final rows = await db.query( table, where: '''$columnLocalId=? AND ($columnTitle=? OR $columnTitle=?) AND - $columnDeviceFolder=? AND $columnCreateTimestamp=?''', + $columnDeviceFolder=? AND $columnCreationTime=? AND $columnModificationTime=?''', whereArgs: [ localId, title, alternateTitle, deviceFolder, - createTimestamp + creationTime, + modificationTime ], ); if (rows.isNotEmpty) { @@ -192,7 +195,7 @@ class FileDB { values[columnUploadedFileId] = uploadedId; values[columnRemotePath] = remotePath; values[columnThumbnailPath] = thumbnailPath; - values[columnUpdateTimestamp] = updateTimestamp; + values[columnUpdationTime] = updateTimestamp; return await db.update( table, values, @@ -253,7 +256,7 @@ class FileDB { table, where: '$columnDeviceFolder =?', whereArgs: [path], - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', limit: 1, ); if (rows.isNotEmpty) { @@ -269,7 +272,7 @@ class FileDB { table, where: '$columnRemoteFolderId =?', whereArgs: [folderId], - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', limit: 1, ); if (rows.isNotEmpty) { @@ -285,7 +288,7 @@ class FileDB { table, where: '$columnRemoteFolderId =?', whereArgs: [folderId], - orderBy: '$columnUpdateTimestamp DESC', + orderBy: '$columnUpdationTime DESC', limit: 1, ); if (rows.isNotEmpty) { @@ -300,7 +303,7 @@ class FileDB { var rows = await db.query( table, where: '$columnGeneratedId IN (${generatedIds.join(",")})', - orderBy: '$columnCreateTimestamp DESC', + orderBy: '$columnCreationTime DESC', limit: 1, ); if (rows.isNotEmpty) { @@ -341,8 +344,9 @@ class FileDB { row[columnRemoteFolderId] = file.remoteFolderId; row[columnRemotePath] = file.remotePath; row[columnThumbnailPath] = file.previewURL; - row[columnCreateTimestamp] = file.createTimestamp; - row[columnUpdateTimestamp] = file.updateTimestamp; + row[columnCreationTime] = file.creationTime; + row[columnModificationTime] = file.modificationTime; + row[columnUpdationTime] = file.updationTime; return row; } @@ -360,10 +364,11 @@ class FileDB { file.remoteFolderId = row[columnRemoteFolderId]; file.remotePath = row[columnRemotePath]; file.previewURL = row[columnThumbnailPath]; - file.createTimestamp = int.parse(row[columnCreateTimestamp]); - file.updateTimestamp = row[columnUpdateTimestamp] == null + file.creationTime = int.parse(row[columnCreationTime]); + file.modificationTime = int.parse(row[columnModificationTime]); + file.updationTime = row[columnUpdationTime] == null ? -1 - : int.parse(row[columnUpdateTimestamp]); + : int.parse(row[columnUpdationTime]); return file; } } diff --git a/lib/face_search_manager.dart b/lib/face_search_manager.dart index 1cb972f93..2336f44c4 100644 --- a/lib/face_search_manager.dart +++ b/lib/face_search_manager.dart @@ -1,6 +1,6 @@ import 'package:dio/dio.dart'; import 'package:photos/core/configuration.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:logging/logging.dart'; import 'package:photos/models/face.dart'; @@ -48,8 +48,12 @@ class FaceSearchManager { final files = List(); for (File file in result) { try { - files.add(await FileDB.instance.getMatchingFile(file.localId, - file.title, file.deviceFolder, file.createTimestamp, + files.add(await FileDB.instance.getMatchingFile( + file.localId, + file.title, + file.deviceFolder, + file.creationTime, + file.modificationTime, alternateTitle: getHEICFileNameForJPG(file))); } catch (e) { // Not available locally @@ -57,7 +61,7 @@ class FaceSearchManager { } } files.sort((first, second) { - return second.createTimestamp.compareTo(first.createTimestamp); + return second.creationTime.compareTo(first.creationTime); }); return files; } diff --git a/lib/file_repository.dart b/lib/file_repository.dart index f44abd6b5..5656ede5a 100644 --- a/lib/file_repository.dart +++ b/lib/file_repository.dart @@ -1,6 +1,6 @@ import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/file.dart'; diff --git a/lib/folder_service.dart b/lib/folder_service.dart index 9d89d9101..2d12b376e 100644 --- a/lib/folder_service.dart +++ b/lib/folder_service.dart @@ -4,7 +4,7 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/db/folder_db.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/remote_sync_event.dart'; import 'package:photos/events/user_authenticated_event.dart'; import 'package:photos/models/folder.dart'; @@ -61,7 +61,7 @@ class FolderSharingService { try { File file = await FileDB.instance.getLastSyncedFileInRemoteFolder(folder.id); - lastSyncTimestamp = file.updateTimestamp; + lastSyncTimestamp = file.updationTime; } catch (e) { // Folder has never been synced } @@ -74,7 +74,7 @@ class FolderSharingService { existingPhoto.generatedId, file.uploadedFileId, file.remotePath, - file.updateTimestamp, + file.updationTime, file.previewURL); } catch (e) { await FileDB.instance.insert(file); diff --git a/lib/models/file.dart b/lib/models/file.dart index 7572b494d..d5ab91815 100644 --- a/lib/models/file.dart +++ b/lib/models/file.dart @@ -18,8 +18,9 @@ class File { int remoteFolderId; String remotePath; String previewURL; - int createTimestamp; - int updateTimestamp; + int creationTime; + int modificationTime; + int updationTime; Location location; FileType fileType; @@ -32,8 +33,9 @@ class File { fileType = getFileType(json["fileType"]); remotePath = json["path"]; previewURL = json["previewURL"]; - createTimestamp = json["createTimestamp"]; - updateTimestamp = json["updateTimestamp"]; + creationTime = json["creationTime"]; + modificationTime = json["modificationTime"]; + updationTime = json["updationTime"]; } static Future fromAsset( @@ -54,19 +56,20 @@ class File { file.fileType = FileType.other; break; } - file.createTimestamp = asset.createDateTime.microsecondsSinceEpoch; - if (file.createTimestamp == 0) { + file.creationTime = asset.createDateTime.microsecondsSinceEpoch; + if (file.creationTime == 0) { try { final parsedDateTime = DateTime.parse( basenameWithoutExtension(file.title) .replaceAll("IMG_", "") .replaceAll("DCIM_", "") .replaceAll("_", " ")); - file.createTimestamp = parsedDateTime.microsecondsSinceEpoch; + file.creationTime = parsedDateTime.microsecondsSinceEpoch; } catch (e) { - file.createTimestamp = asset.modifiedDateTime.microsecondsSinceEpoch; + file.creationTime = asset.modifiedDateTime.microsecondsSinceEpoch; } } + file.modificationTime = asset.modifiedDateTime.microsecondsSinceEpoch; return file; } @@ -111,7 +114,7 @@ class File { return '''File(generatedId: $generatedId, uploadedFileId: $uploadedFileId, localId: $localId, title: $title, deviceFolder: $deviceFolder, location: $location, remotePath: $remotePath, fileType: $fileType, - createTimestamp: $createTimestamp, updateTimestamp: $updateTimestamp)'''; + createTimestamp: $creationTime, updateTimestamp: $updationTime)'''; } @override diff --git a/lib/photo_sync_manager.dart b/lib/photo_sync_manager.dart index 788f4b3da..302a555e2 100644 --- a/lib/photo_sync_manager.dart +++ b/lib/photo_sync_manager.dart @@ -4,12 +4,13 @@ import 'dart:math'; import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/photo_upload_event.dart'; import 'package:photos/events/user_authenticated_event.dart'; import 'package:photos/file_repository.dart'; import 'package:path_provider/path_provider.dart'; import 'package:photo_manager/photo_manager.dart'; +import 'package:photos/models/file_type.dart'; import 'package:photos/utils/file_name_util.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:dio/dio.dart'; @@ -87,8 +88,8 @@ class PhotoSyncManager { } if (files.isNotEmpty) { - files.sort((first, second) => - first.createTimestamp.compareTo(second.createTimestamp)); + files.sort( + (first, second) => first.creationTime.compareTo(second.creationTime)); await _updateDatabase( files, prefs, lastDBUpdateTimestamp, syncStartTimestamp); await FileRepository.instance.reloadFiles(); @@ -156,7 +157,7 @@ class PhotoSyncManager { int lastDBUpdateTimestamp, int syncStartTimestamp) async { var filesToBeAdded = List(); for (File file in files) { - if (file.createTimestamp > lastDBUpdateTimestamp) { + if (file.creationTime > lastDBUpdateTimestamp) { filesToBeAdded.add(file); } } @@ -186,12 +187,15 @@ class PhotoSyncManager { List photosToBeUploaded = await _db.getFilesToBeUploaded(); for (int i = 0; i < photosToBeUploaded.length; i++) { File file = photosToBeUploaded[i]; + if (file.fileType != FileType.video) { + continue; + } _logger.info("Uploading " + file.toString()); try { var uploadedFile = await _uploadFile(file); await _db.update(file.generatedId, uploadedFile.uploadedFileId, - uploadedFile.remotePath, uploadedFile.updateTimestamp); - prefs.setInt(_lastSyncTimestampKey, uploadedFile.updateTimestamp); + uploadedFile.remotePath, uploadedFile.updationTime); + prefs.setInt(_lastSyncTimestampKey, uploadedFile.updationTime); Bus.instance.fire(PhotoUploadEvent( completed: i + 1, total: photosToBeUploaded.length)); @@ -205,15 +209,15 @@ class PhotoSyncManager { Future _storeDiff(List diff, SharedPreferences prefs) async { for (File file in diff) { try { - var existingPhoto = await _db.getMatchingFile( - file.localId, file.title, file.deviceFolder, file.createTimestamp, + var existingPhoto = await _db.getMatchingFile(file.localId, file.title, + file.deviceFolder, file.creationTime, file.modificationTime, alternateTitle: getHEICFileNameForJPG(file)); await _db.update(existingPhoto.generatedId, file.uploadedFileId, - file.remotePath, file.updateTimestamp, file.previewURL); + file.remotePath, file.updationTime, file.previewURL); } catch (e) { await _db.insert(file); } - await prefs.setInt(_lastSyncTimestampKey, file.updateTimestamp); + await prefs.setInt(_lastSyncTimestampKey, file.updationTime); } } @@ -247,7 +251,8 @@ class PhotoSyncManager { "deviceFileID": localPhoto.localId, "deviceFolder": localPhoto.deviceFolder, "title": title, - "createTimestamp": localPhoto.createTimestamp, + "creationTime": localPhoto.creationTime, + "modificationTime": localPhoto.modificationTime, }); return _dio .post( diff --git a/lib/ui/detail_page.dart b/lib/ui/detail_page.dart index cce5b25b4..2f9490403 100644 --- a/lib/ui/detail_page.dart +++ b/lib/ui/detail_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:like_button/like_button.dart'; import 'package:photo_manager/photo_manager.dart'; import 'package:photos/core/cache/image_cache.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/favorite_files_repository.dart'; import 'package:photos/file_repository.dart'; import 'package:photos/models/file_type.dart'; @@ -218,7 +218,7 @@ class _DetailPageState extends State { Icon(Icons.timer), Padding(padding: EdgeInsets.all(4)), Text(getFormattedTime( - DateTime.fromMicrosecondsSinceEpoch(file.createTimestamp))), + DateTime.fromMicrosecondsSinceEpoch(file.creationTime))), ], ), Padding(padding: EdgeInsets.all(4)), diff --git a/lib/ui/device_folders_gallery_widget.dart b/lib/ui/device_folders_gallery_widget.dart index 3ba38e1d4..f9ea509c3 100644 --- a/lib/ui/device_folders_gallery_widget.dart +++ b/lib/ui/device_folders_gallery_widget.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/favorite_files_repository.dart'; import 'package:photos/models/device_folder.dart'; @@ -77,8 +77,8 @@ class _DeviceFolderGalleryWidgetState extends State { folders.add(DeviceFolder(folderName, file, FolderNameFilter(folderName))); } folders.sort((first, second) { - return second.thumbnail.createTimestamp - .compareTo(first.thumbnail.createTimestamp); + return second.thumbnail.creationTime + .compareTo(first.thumbnail.creationTime); }); if (FavoriteFilesRepository.instance.hasFavorites()) { final file = await FileDB.instance.getLatestFileAmongGeneratedIds( diff --git a/lib/ui/gallery.dart b/lib/ui/gallery.dart index 3ce210e56..1b717d44e 100644 --- a/lib/ui/gallery.dart +++ b/lib/ui/gallery.dart @@ -125,7 +125,7 @@ class _GalleryState extends State { Widget _buildListItem(BuildContext context, int index) { var files = _collatedFiles[index]; return Column( - children: [_getDay(files[0].createTimestamp), _getGallery(files)], + children: [_getDay(files[0].creationTime), _getGallery(files)], ); } @@ -229,9 +229,9 @@ class _GalleryState extends State { } bool _areFilesFromSameDay(File first, File second) { - var firstDate = DateTime.fromMicrosecondsSinceEpoch(first.createTimestamp); + var firstDate = DateTime.fromMicrosecondsSinceEpoch(first.creationTime); var secondDate = - DateTime.fromMicrosecondsSinceEpoch(second.createTimestamp); + DateTime.fromMicrosecondsSinceEpoch(second.creationTime); return firstDate.year == secondDate.year && firstDate.month == secondDate.month && firstDate.day == secondDate.day; diff --git a/lib/ui/gallery_app_bar_widget.dart b/lib/ui/gallery_app_bar_widget.dart index 9e7be9b53..638e665c5 100644 --- a/lib/ui/gallery_app_bar_widget.dart +++ b/lib/ui/gallery_app_bar_widget.dart @@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/remote_sync_event.dart'; import 'package:photos/models/file.dart'; import 'package:photos/file_repository.dart'; diff --git a/lib/ui/remote_folder_gallery_widget.dart b/lib/ui/remote_folder_gallery_widget.dart index 1be53dd40..a2bc66e41 100644 --- a/lib/ui/remote_folder_gallery_widget.dart +++ b/lib/ui/remote_folder_gallery_widget.dart @@ -6,7 +6,7 @@ import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/db/folder_db.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/events/remote_sync_event.dart'; import 'package:photos/models/folder.dart'; import 'package:photos/ui/loading_widget.dart'; diff --git a/lib/ui/remote_folder_page.dart b/lib/ui/remote_folder_page.dart index f492bf44d..f94b27449 100644 --- a/lib/ui/remote_folder_page.dart +++ b/lib/ui/remote_folder_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:photos/db/photo_db.dart'; +import 'package:photos/db/file_db.dart'; import 'package:photos/folder_service.dart'; import 'package:photos/models/folder.dart'; import 'package:photos/models/file.dart';