Add modificationTime as an attribute of a file

This commit is contained in:
Vishnu Mohandas 2020-07-07 00:39:47 +05:30
parent f79f2497e7
commit 8c031a87fd
12 changed files with 79 additions and 62 deletions

View file

@ -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<File> getMatchingFile(
String localId, String title, String deviceFolder, int createTimestamp,
Future<File> 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;
}
}

View file

@ -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<File>();
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;
}

View file

@ -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';

View file

@ -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);

View file

@ -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<File> 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

View file

@ -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<File>();
for (File file in files) {
if (file.createTimestamp > lastDBUpdateTimestamp) {
if (file.creationTime > lastDBUpdateTimestamp) {
filesToBeAdded.add(file);
}
}
@ -186,12 +187,15 @@ class PhotoSyncManager {
List<File> 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<File> 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(

View file

@ -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<DetailPage> {
Icon(Icons.timer),
Padding(padding: EdgeInsets.all(4)),
Text(getFormattedTime(
DateTime.fromMicrosecondsSinceEpoch(file.createTimestamp))),
DateTime.fromMicrosecondsSinceEpoch(file.creationTime))),
],
),
Padding(padding: EdgeInsets.all(4)),

View file

@ -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<DeviceFolderGalleryWidget> {
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(

View file

@ -125,7 +125,7 @@ class _GalleryState extends State<Gallery> {
Widget _buildListItem(BuildContext context, int index) {
var files = _collatedFiles[index];
return Column(
children: <Widget>[_getDay(files[0].createTimestamp), _getGallery(files)],
children: <Widget>[_getDay(files[0].creationTime), _getGallery(files)],
);
}
@ -229,9 +229,9 @@ class _GalleryState extends State<Gallery> {
}
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;

View file

@ -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';

View file

@ -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';

View file

@ -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';