Browse Source

Fix issue with loading remote images

Vishnu Mohandas 5 years ago
parent
commit
c7b40265c3

+ 61 - 51
lib/db/files_db.dart

@@ -16,15 +16,16 @@ class FilesDB {
 
 
   static final table = 'files';
   static final table = 'files';
 
 
-  static final columnGeneratedId = '_id';
-  static final columnUploadedFileId = 'uploaded_file_id';
-  static final columnLocalId = 'local_id';
+  static final columnGeneratedID = '_id';
+  static final columnUploadedFileID = 'uploaded_file_id';
+  static final columnOwnerID = 'owner_id';
+  static final columnLocalID = 'local_id';
   static final columnTitle = 'title';
   static final columnTitle = 'title';
   static final columnDeviceFolder = 'device_folder';
   static final columnDeviceFolder = 'device_folder';
   static final columnLatitude = 'latitude';
   static final columnLatitude = 'latitude';
   static final columnLongitude = 'longitude';
   static final columnLongitude = 'longitude';
   static final columnFileType = 'file_type';
   static final columnFileType = 'file_type';
-  static final columnRemoteFolderId = 'remote_folder_id';
+  static final columnRemoteFolderID = 'remote_folder_id';
   static final columnIsDeleted = 'is_deleted';
   static final columnIsDeleted = 'is_deleted';
   static final columnCreationTime = 'creation_time';
   static final columnCreationTime = 'creation_time';
   static final columnModificationTime = 'modification_time';
   static final columnModificationTime = 'modification_time';
@@ -55,15 +56,16 @@ class FilesDB {
   Future _onCreate(Database db, int version) async {
   Future _onCreate(Database db, int version) async {
     await db.execute('''
     await db.execute('''
           CREATE TABLE $table (
           CREATE TABLE $table (
-            $columnGeneratedId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-            $columnLocalId TEXT,
-            $columnUploadedFileId INTEGER,
+            $columnGeneratedID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+            $columnLocalID TEXT,
+            $columnUploadedFileID INTEGER,
+            $columnOwnerID INTEGER,
             $columnTitle TEXT NOT NULL,
             $columnTitle TEXT NOT NULL,
             $columnDeviceFolder TEXT NOT NULL,
             $columnDeviceFolder TEXT NOT NULL,
             $columnLatitude REAL,
             $columnLatitude REAL,
             $columnLongitude REAL,
             $columnLongitude REAL,
             $columnFileType INTEGER,
             $columnFileType INTEGER,
-            $columnRemoteFolderId INTEGER,
+            $columnRemoteFolderID INTEGER,
             $columnIsDeleted INTEGER DEFAULT 0,
             $columnIsDeleted INTEGER DEFAULT 0,
             $columnCreationTime TEXT NOT NULL,
             $columnCreationTime TEXT NOT NULL,
             $columnModificationTime TEXT NOT NULL,
             $columnModificationTime TEXT NOT NULL,
@@ -92,11 +94,17 @@ class FilesDB {
     return await batch.commit();
     return await batch.commit();
   }
   }
 
 
-  Future<List<File>> getAllLocalFiles() async {
+  Future<List<File>> getOwnedFiles(int ownerID) async {
     final db = await instance.database;
     final db = await instance.database;
+    final whereArgs = List<dynamic>();
+    if (ownerID != null) {
+      whereArgs.add(ownerID);
+    }
     final results = await db.query(
     final results = await db.query(
       table,
       table,
-      where: '$columnLocalId IS NOT NULL AND $columnIsDeleted = 0',
+      // where: '$columnIsDeleted = 0' +
+      //     (ownerID == null ? '' : ' AND $columnOwnerID = ?'),
+      // whereArgs: whereArgs,
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
     );
     );
     return _convertToFiles(results);
     return _convertToFiles(results);
@@ -107,20 +115,20 @@ class FilesDB {
     final results = await db.query(
     final results = await db.query(
       table,
       table,
       where:
       where:
-          '$columnLocalId IS NOT NULL AND $columnFileType = 1 AND $columnIsDeleted = 0',
+          '$columnLocalID IS NOT NULL AND $columnFileType = 1 AND $columnIsDeleted = 0',
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
     );
     );
     return _convertToFiles(results);
     return _convertToFiles(results);
   }
   }
 
 
   Future<List<File>> getAllInFolder(
   Future<List<File>> getAllInFolder(
-      int folderId, int beforeCreationTime, int limit) async {
+      int folderID, int beforeCreationTime, int limit) async {
     final db = await instance.database;
     final db = await instance.database;
     final results = await db.query(
     final results = await db.query(
       table,
       table,
       where:
       where:
-          '$columnRemoteFolderId = ? AND $columnIsDeleted = 0 AND $columnCreationTime < ?',
-      whereArgs: [folderId, beforeCreationTime],
+          '$columnRemoteFolderID = ? AND $columnIsDeleted = 0 AND $columnCreationTime < ?',
+      whereArgs: [folderID, beforeCreationTime],
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
       limit: limit,
       limit: limit,
     );
     );
@@ -154,22 +162,22 @@ class FilesDB {
     final db = await instance.database;
     final db = await instance.database;
     final results = await db.query(
     final results = await db.query(
       table,
       table,
-      where: '$columnUploadedFileId IS NULL',
+      where: '$columnUploadedFileID IS NULL',
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
     );
     );
     return _convertToFiles(results);
     return _convertToFiles(results);
   }
   }
 
 
-  Future<File> getMatchingFile(String localId, String title,
+  Future<File> getMatchingFile(String localID, String title,
       String deviceFolder, int creationTime, int modificationTime,
       String deviceFolder, int creationTime, int modificationTime,
       {String alternateTitle}) async {
       {String alternateTitle}) async {
     final db = await instance.database;
     final db = await instance.database;
     final rows = await db.query(
     final rows = await db.query(
       table,
       table,
-      where: '''$columnLocalId=? AND ($columnTitle=? OR $columnTitle=?) AND 
+      where: '''$columnLocalID=? AND ($columnTitle=? OR $columnTitle=?) AND 
           $columnDeviceFolder=? AND $columnCreationTime=? AND $columnModificationTime=?''',
           $columnDeviceFolder=? AND $columnCreationTime=? AND $columnModificationTime=?''',
       whereArgs: [
       whereArgs: [
-        localId,
+        localID,
         title,
         title,
         alternateTitle,
         alternateTitle,
         deviceFolder,
         deviceFolder,
@@ -184,12 +192,12 @@ class FilesDB {
     }
     }
   }
   }
 
 
-  Future<File> getMatchingRemoteFile(int uploadedFileId) async {
+  Future<File> getMatchingRemoteFile(int uploadedFileID) async {
     final db = await instance.database;
     final db = await instance.database;
     final rows = await db.query(
     final rows = await db.query(
       table,
       table,
-      where: '$columnUploadedFileId=?',
-      whereArgs: [uploadedFileId],
+      where: '$columnUploadedFileID=?',
+      whereArgs: [uploadedFileID],
     );
     );
     if (rows.isNotEmpty) {
     if (rows.isNotEmpty) {
       return _getFileFromRow(rows[0]);
       return _getFileFromRow(rows[0]);
@@ -198,16 +206,16 @@ class FilesDB {
     }
     }
   }
   }
 
 
-  Future<int> update(int generatedId, int uploadedId, int updationTime) async {
+  Future<int> update(int generatedID, int uploadedID, int updationTime) async {
     final db = await instance.database;
     final db = await instance.database;
     final values = new Map<String, dynamic>();
     final values = new Map<String, dynamic>();
-    values[columnUploadedFileId] = uploadedId;
+    values[columnUploadedFileID] = uploadedID;
     values[columnUpdationTime] = updationTime;
     values[columnUpdationTime] = updationTime;
     return await db.update(
     return await db.update(
       table,
       table,
       values,
       values,
-      where: '$columnGeneratedId = ?',
-      whereArgs: [generatedId],
+      where: '$columnGeneratedID = ?',
+      whereArgs: [generatedID],
     );
     );
   }
   }
 
 
@@ -219,8 +227,8 @@ class FilesDB {
     return db.update(
     return db.update(
       table,
       table,
       values,
       values,
-      where: '$columnGeneratedId =?',
-      whereArgs: [file.generatedId],
+      where: '$columnGeneratedID =?',
+      whereArgs: [file.generatedID],
     );
     );
   }
   }
 
 
@@ -228,17 +236,17 @@ class FilesDB {
     final db = await instance.database;
     final db = await instance.database;
     return db.delete(
     return db.delete(
       table,
       table,
-      where: '$columnGeneratedId =?',
-      whereArgs: [file.generatedId],
+      where: '$columnGeneratedID =?',
+      whereArgs: [file.generatedID],
     );
     );
   }
   }
 
 
-  Future<int> deleteFilesInRemoteFolder(int folderId) async {
+  Future<int> deleteFilesInRemoteFolder(int folderID) async {
     final db = await instance.database;
     final db = await instance.database;
     return db.delete(
     return db.delete(
       table,
       table,
-      where: '$columnRemoteFolderId =?',
-      whereArgs: [folderId],
+      where: '$columnRemoteFolderID =?',
+      whereArgs: [folderID],
     );
     );
   }
   }
 
 
@@ -248,7 +256,7 @@ class FilesDB {
       table,
       table,
       columns: [columnDeviceFolder],
       columns: [columnDeviceFolder],
       distinct: true,
       distinct: true,
-      where: '$columnRemoteFolderId IS NULL',
+      where: '$columnRemoteFolderID IS NULL',
     );
     );
     List<String> result = List<String>();
     List<String> result = List<String>();
     for (final row in rows) {
     for (final row in rows) {
@@ -273,50 +281,50 @@ class FilesDB {
     }
     }
   }
   }
 
 
-  Future<File> getLatestFileInRemoteFolder(int folderId) async {
+  Future<File> getLatestFileInRemoteFolder(int folderID) async {
     final db = await instance.database;
     final db = await instance.database;
     final rows = await db.query(
     final rows = await db.query(
       table,
       table,
-      where: '$columnRemoteFolderId =?',
-      whereArgs: [folderId],
+      where: '$columnRemoteFolderID =?',
+      whereArgs: [folderID],
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
       limit: 1,
       limit: 1,
     );
     );
     if (rows.isNotEmpty) {
     if (rows.isNotEmpty) {
       return _getFileFromRow(rows[0]);
       return _getFileFromRow(rows[0]);
     } else {
     } else {
-      throw ("No file found in remote folder " + folderId.toString());
+      throw ("No file found in remote folder " + folderID.toString());
     }
     }
   }
   }
 
 
-  Future<File> getLastSyncedFileInRemoteFolder(int folderId) async {
+  Future<File> getLastSyncedFileInRemoteFolder(int folderID) async {
     final db = await instance.database;
     final db = await instance.database;
     final rows = await db.query(
     final rows = await db.query(
       table,
       table,
-      where: '$columnRemoteFolderId =?',
-      whereArgs: [folderId],
+      where: '$columnRemoteFolderID =?',
+      whereArgs: [folderID],
       orderBy: '$columnUpdationTime DESC',
       orderBy: '$columnUpdationTime DESC',
       limit: 1,
       limit: 1,
     );
     );
     if (rows.isNotEmpty) {
     if (rows.isNotEmpty) {
       return _getFileFromRow(rows[0]);
       return _getFileFromRow(rows[0]);
     } else {
     } else {
-      throw ("No file found in remote folder " + folderId.toString());
+      throw ("No file found in remote folder " + folderID.toString());
     }
     }
   }
   }
 
 
-  Future<File> getLatestFileAmongGeneratedIds(List<String> generatedIds) async {
+  Future<File> getLatestFileAmongGeneratedIDs(List<String> generatedIDs) async {
     final db = await instance.database;
     final db = await instance.database;
     final rows = await db.query(
     final rows = await db.query(
       table,
       table,
-      where: '$columnGeneratedId IN (${generatedIds.join(",")})',
+      where: '$columnGeneratedID IN (${generatedIDs.join(",")})',
       orderBy: '$columnCreationTime DESC',
       orderBy: '$columnCreationTime DESC',
       limit: 1,
       limit: 1,
     );
     );
     if (rows.isNotEmpty) {
     if (rows.isNotEmpty) {
       return _getFileFromRow(rows[0]);
       return _getFileFromRow(rows[0]);
     } else {
     } else {
-      throw ("No file found with ids " + generatedIds.join(", ").toString());
+      throw ("No file found with ids " + generatedIDs.join(", ").toString());
     }
     }
   }
   }
 
 
@@ -330,8 +338,9 @@ class FilesDB {
 
 
   Map<String, dynamic> _getRowForFile(File file) {
   Map<String, dynamic> _getRowForFile(File file) {
     final row = new Map<String, dynamic>();
     final row = new Map<String, dynamic>();
-    row[columnLocalId] = file.localId;
-    row[columnUploadedFileId] = file.uploadedFileId;
+    row[columnLocalID] = file.localID;
+    row[columnUploadedFileID] = file.uploadedFileID;
+    row[columnOwnerID] = file.ownerID;
     row[columnTitle] = file.title;
     row[columnTitle] = file.title;
     row[columnDeviceFolder] = file.deviceFolder;
     row[columnDeviceFolder] = file.deviceFolder;
     if (file.location != null) {
     if (file.location != null) {
@@ -348,7 +357,7 @@ class FilesDB {
       default:
       default:
         row[columnFileType] = -1;
         row[columnFileType] = -1;
     }
     }
-    row[columnRemoteFolderId] = file.remoteFolderId;
+    row[columnRemoteFolderID] = file.remoteFolderID;
     row[columnCreationTime] = file.creationTime;
     row[columnCreationTime] = file.creationTime;
     row[columnModificationTime] = file.modificationTime;
     row[columnModificationTime] = file.modificationTime;
     row[columnUpdationTime] = file.updationTime;
     row[columnUpdationTime] = file.updationTime;
@@ -357,16 +366,17 @@ class FilesDB {
 
 
   File _getFileFromRow(Map<String, dynamic> row) {
   File _getFileFromRow(Map<String, dynamic> row) {
     final file = File();
     final file = File();
-    file.generatedId = row[columnGeneratedId];
-    file.localId = row[columnLocalId];
-    file.uploadedFileId = row[columnUploadedFileId];
+    file.generatedID = row[columnGeneratedID];
+    file.localID = row[columnLocalID];
+    file.uploadedFileID = row[columnUploadedFileID];
+    file.ownerID = row[columnUploadedFileID];
     file.title = row[columnTitle];
     file.title = row[columnTitle];
     file.deviceFolder = row[columnDeviceFolder];
     file.deviceFolder = row[columnDeviceFolder];
     if (row[columnLatitude] != null && row[columnLongitude] != null) {
     if (row[columnLatitude] != null && row[columnLongitude] != null) {
       file.location = Location(row[columnLatitude], row[columnLongitude]);
       file.location = Location(row[columnLatitude], row[columnLongitude]);
     }
     }
     file.fileType = getFileType(row[columnFileType]);
     file.fileType = getFileType(row[columnFileType]);
-    file.remoteFolderId = row[columnRemoteFolderId];
+    file.remoteFolderID = row[columnRemoteFolderID];
     file.creationTime = int.parse(row[columnCreationTime]);
     file.creationTime = int.parse(row[columnCreationTime]);
     file.modificationTime = int.parse(row[columnModificationTime]);
     file.modificationTime = int.parse(row[columnModificationTime]);
     file.updationTime = row[columnUpdationTime] == null
     file.updationTime = row[columnUpdationTime] == null

+ 1 - 1
lib/db/memories_db.dart

@@ -66,7 +66,7 @@ class MemoriesDB {
 
 
   Map<String, dynamic> _getRowForSeenMemory(Memory memory, int timestamp) {
   Map<String, dynamic> _getRowForSeenMemory(Memory memory, int timestamp) {
     var row = new Map<String, dynamic>();
     var row = new Map<String, dynamic>();
-    row[columnFileID] = memory.file.generatedId;
+    row[columnFileID] = memory.file.generatedID;
     row[columnSeenTime] = timestamp;
     row[columnSeenTime] = timestamp;
     return row;
     return row;
   }
   }

+ 1 - 1
lib/face_search_manager.dart

@@ -55,7 +55,7 @@ class FaceSearchManager {
     for (File file in result) {
     for (File file in result) {
       try {
       try {
         files.add(await FilesDB.instance.getMatchingFile(
         files.add(await FilesDB.instance.getMatchingFile(
-            file.localId,
+            file.localID,
             file.title,
             file.title,
             file.deviceFolder,
             file.deviceFolder,
             file.creationTime,
             file.creationTime,

+ 3 - 3
lib/favorite_files_repository.dart

@@ -16,7 +16,7 @@ class FavoriteFilesRepository {
   }
   }
 
 
   bool isLiked(File photo) {
   bool isLiked(File photo) {
-    return getLiked().contains(photo.generatedId.toString());
+    return getLiked().contains(photo.generatedID.toString());
   }
   }
 
 
   bool hasFavorites() {
   bool hasFavorites() {
@@ -26,9 +26,9 @@ class FavoriteFilesRepository {
   Future<bool> setLiked(File photo, bool isLiked) {
   Future<bool> setLiked(File photo, bool isLiked) {
     final liked = getLiked();
     final liked = getLiked();
     if (isLiked) {
     if (isLiked) {
-      liked.add(photo.generatedId.toString());
+      liked.add(photo.generatedID.toString());
     } else {
     } else {
-      liked.remove(photo.generatedId.toString());
+      liked.remove(photo.generatedID.toString());
     }
     }
     Bus.instance.fire(LocalPhotosUpdatedEvent());
     Bus.instance.fire(LocalPhotosUpdatedEvent());
     return _preferences
     return _preferences

+ 3 - 1
lib/file_repository.dart

@@ -1,4 +1,5 @@
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
+import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
@@ -16,7 +17,8 @@ class FileRepository {
   }
   }
 
 
   Future<List<File>> loadFiles() async {
   Future<List<File>> loadFiles() async {
-    var files = await FilesDB.instance.getAllLocalFiles();
+    var files = await FilesDB.instance
+        .getOwnedFiles(Configuration.instance.getUserID());
 
 
     _files.clear();
     _files.clear();
     _files.addAll(files);
     _files.addAll(files);

+ 4 - 4
lib/folder_service.dart

@@ -69,9 +69,9 @@ class FolderSharingService {
     for (File file in diff) {
     for (File file in diff) {
       try {
       try {
         var existingPhoto =
         var existingPhoto =
-            await FilesDB.instance.getMatchingRemoteFile(file.uploadedFileId);
+            await FilesDB.instance.getMatchingRemoteFile(file.uploadedFileID);
         await FilesDB.instance.update(
         await FilesDB.instance.update(
-            existingPhoto.generatedId, file.uploadedFileId, file.updationTime);
+            existingPhoto.generatedID, file.uploadedFileID, file.updationTime);
       } catch (e) {
       } catch (e) {
         await FilesDB.instance.insert(file);
         await FilesDB.instance.insert(file);
       }
       }
@@ -97,8 +97,8 @@ class FolderSharingService {
     if (response != null) {
     if (response != null) {
       return (response.data["diff"] as List).map((p) {
       return (response.data["diff"] as List).map((p) {
         File file = new File.fromJson(p);
         File file = new File.fromJson(p);
-        file.localId = null;
-        file.remoteFolderId = folderId;
+        file.localID = null;
+        file.remoteFolderID = folderId;
         return file;
         return file;
       }).toList();
       }).toList();
     } else {
     } else {

+ 1 - 1
lib/memories_service.dart

@@ -57,7 +57,7 @@ class MemoriesService extends ChangeNotifier {
     final memories = List<Memory>();
     final memories = List<Memory>();
     for (final file in files) {
     for (final file in files) {
       if (filter.shouldInclude(file)) {
       if (filter.shouldInclude(file)) {
-        final seenTime = seenTimes[file.generatedId] ?? -1;
+        final seenTime = seenTimes[file.generatedID] ?? -1;
         memories.add(Memory(file, seenTime));
         memories.add(Memory(file, seenTime));
       }
       }
     }
     }

+ 23 - 21
lib/models/file.dart

@@ -10,12 +10,13 @@ import 'package:photos/models/file_type.dart';
 import 'package:photos/models/location.dart';
 import 'package:photos/models/location.dart';
 
 
 class File {
 class File {
-  int generatedId;
-  int uploadedFileId;
-  String localId;
+  int generatedID;
+  int uploadedFileID;
+  int ownerID;
+  String localID;
   String title;
   String title;
   String deviceFolder;
   String deviceFolder;
-  int remoteFolderId;
+  int remoteFolderID;
   int creationTime;
   int creationTime;
   int modificationTime;
   int modificationTime;
   int updationTime;
   int updationTime;
@@ -24,8 +25,9 @@ class File {
 
 
   File();
   File();
   File.fromJson(Map<String, dynamic> json) {
   File.fromJson(Map<String, dynamic> json) {
-    uploadedFileId = json["id"];
-    localId = json["deviceFileID"];
+    uploadedFileID = json["id"];
+    ownerID = json["ownerID"];
+    localID = json["deviceFileID"];
     deviceFolder = json["deviceFolder"];
     deviceFolder = json["deviceFolder"];
     title = json["title"];
     title = json["title"];
     fileType = getFileType(json["fileType"]);
     fileType = getFileType(json["fileType"]);
@@ -37,7 +39,7 @@ class File {
   static Future<File> fromAsset(
   static Future<File> fromAsset(
       AssetPathEntity pathEntity, AssetEntity asset) async {
       AssetPathEntity pathEntity, AssetEntity asset) async {
     File file = File();
     File file = File();
-    file.localId = asset.id;
+    file.localID = asset.id;
     file.title = asset.title;
     file.title = asset.title;
     file.deviceFolder = pathEntity.name;
     file.deviceFolder = pathEntity.name;
     file.location = Location(asset.latitude, asset.longitude);
     file.location = Location(asset.latitude, asset.longitude);
@@ -70,11 +72,11 @@ class File {
   }
   }
 
 
   Future<AssetEntity> getAsset() {
   Future<AssetEntity> getAsset() {
-    return AssetEntity.fromId(localId);
+    return AssetEntity.fromId(localID);
   }
   }
 
 
   Future<Uint8List> getBytes({int quality = 100}) async {
   Future<Uint8List> getBytes({int quality = 100}) async {
-    if (localId == null) {
+    if (localID == null) {
       return HttpClient().getUrl(Uri.parse(getDownloadUrl())).then((request) {
       return HttpClient().getUrl(Uri.parse(getDownloadUrl())).then((request) {
         return request.close().then((response) {
         return request.close().then((response) {
           return consolidateHttpClientResponseBytes(response);
           return consolidateHttpClientResponseBytes(response);
@@ -98,7 +100,7 @@ class File {
   String getDownloadUrl() {
   String getDownloadUrl() {
     return Configuration.instance.getHttpEndpoint() +
     return Configuration.instance.getHttpEndpoint() +
         "/files/download/" +
         "/files/download/" +
-        uploadedFileId.toString() +
+        uploadedFileID.toString() +
         "?token=" +
         "?token=" +
         Configuration.instance.getToken();
         Configuration.instance.getToken();
   }
   }
@@ -109,22 +111,22 @@ class File {
         "/streams/" +
         "/streams/" +
         Configuration.instance.getToken() +
         Configuration.instance.getToken() +
         "/" +
         "/" +
-        uploadedFileId.toString() +
+        uploadedFileID.toString() +
         "/index.m3u8";
         "/index.m3u8";
   }
   }
 
 
   String getThumbnailUrl() {
   String getThumbnailUrl() {
     return Configuration.instance.getHttpEndpoint() +
     return Configuration.instance.getHttpEndpoint() +
         "/files/preview/" +
         "/files/preview/" +
-        uploadedFileId.toString() +
+        uploadedFileID.toString() +
         "?token=" +
         "?token=" +
         Configuration.instance.getToken();
         Configuration.instance.getToken();
   }
   }
 
 
   @override
   @override
   String toString() {
   String toString() {
-    return '''File(generatedId: $generatedId, uploadedFileId: $uploadedFileId, 
-      localId: $localId, title: $title, deviceFolder: $deviceFolder, 
+    return '''File(generatedId: $generatedID, uploadedFileId: $uploadedFileID, 
+      localId: $localID, title: $title, deviceFolder: $deviceFolder, 
       location: $location, fileType: $fileType, creationTime: $creationTime, 
       location: $location, fileType: $fileType, creationTime: $creationTime, 
       modificationTime: $modificationTime, updationTime: $updationTime)''';
       modificationTime: $modificationTime, updationTime: $updationTime)''';
   }
   }
@@ -134,22 +136,22 @@ class File {
     if (identical(this, o)) return true;
     if (identical(this, o)) return true;
 
 
     return o is File &&
     return o is File &&
-        o.generatedId == generatedId &&
-        o.uploadedFileId == uploadedFileId &&
-        o.localId == localId;
+        o.generatedID == generatedID &&
+        o.uploadedFileID == uploadedFileID &&
+        o.localID == localID;
   }
   }
 
 
   @override
   @override
   int get hashCode {
   int get hashCode {
-    return generatedId.hashCode ^ uploadedFileId.hashCode ^ localId.hashCode;
+    return generatedID.hashCode ^ uploadedFileID.hashCode ^ localID.hashCode;
   }
   }
 
 
   String tag() {
   String tag() {
     return "local_" +
     return "local_" +
-        localId.toString() +
+        localID.toString() +
         ":remote_" +
         ":remote_" +
-        uploadedFileId.toString() +
+        uploadedFileID.toString() +
         ":generated_" +
         ":generated_" +
-        generatedId.toString();
+        generatedID.toString();
   }
   }
 }
 }

+ 6 - 5
lib/photo_sync_manager.dart

@@ -182,7 +182,7 @@ class PhotoSyncManager {
       _logger.info("Uploading " + file.toString());
       _logger.info("Uploading " + file.toString());
       try {
       try {
         final uploadedFile = await _uploadFile(file);
         final uploadedFile = await _uploadFile(file);
-        await _db.update(file.generatedId, uploadedFile.uploadedFileId,
+        await _db.update(file.generatedID, uploadedFile.uploadedFileID,
             uploadedFile.updationTime);
             uploadedFile.updationTime);
         _prefs.setInt(_lastSyncTimeKey, uploadedFile.updationTime);
         _prefs.setInt(_lastSyncTimeKey, uploadedFile.updationTime);
 
 
@@ -199,15 +199,16 @@ class PhotoSyncManager {
     for (File file in diff) {
     for (File file in diff) {
       try {
       try {
         final existingPhoto = await _db.getMatchingFile(
         final existingPhoto = await _db.getMatchingFile(
-            file.localId,
+            file.localID,
             file.title,
             file.title,
             file.deviceFolder,
             file.deviceFolder,
             file.creationTime,
             file.creationTime,
             file.modificationTime,
             file.modificationTime,
             alternateTitle: getHEICFileNameForJPG(file));
             alternateTitle: getHEICFileNameForJPG(file));
         await _db.update(
         await _db.update(
-            existingPhoto.generatedId, file.uploadedFileId, file.updationTime);
+            existingPhoto.generatedID, file.uploadedFileID, file.updationTime);
       } catch (e) {
       } catch (e) {
+        file.localID = null; // File uploaded from a different device
         await _db.insert(file);
         await _db.insert(file);
       }
       }
       await _prefs.setInt(_lastSyncTimeKey, file.updationTime);
       await _prefs.setInt(_lastSyncTimeKey, file.updationTime);
@@ -241,7 +242,7 @@ class PhotoSyncManager {
       "file": MultipartFile.fromFileSync(
       "file": MultipartFile.fromFileSync(
           (await (await localPhoto.getAsset()).originFile).path,
           (await (await localPhoto.getAsset()).originFile).path,
           filename: title),
           filename: title),
-      "deviceFileID": localPhoto.localId,
+      "deviceFileID": localPhoto.localID,
       "deviceFolder": localPhoto.deviceFolder,
       "deviceFolder": localPhoto.deviceFolder,
       "title": title,
       "title": title,
       "creationTime": localPhoto.creationTime,
       "creationTime": localPhoto.creationTime,
@@ -273,7 +274,7 @@ class PhotoSyncManager {
         .delete(
         .delete(
           Configuration.instance.getHttpEndpoint() +
           Configuration.instance.getHttpEndpoint() +
               "/files/" +
               "/files/" +
-              file.uploadedFileId.toString(),
+              file.uploadedFileID.toString(),
           options: Options(
           options: Options(
               headers: {"X-Auth-Token": Configuration.instance.getToken()}),
               headers: {"X-Auth-Token": Configuration.instance.getToken()}),
         )
         )

+ 1 - 1
lib/ui/detail_page.dart

@@ -114,7 +114,7 @@ class _DetailPageState extends State<DetailPage> {
 
 
   AppBar _buildAppBar() {
   AppBar _buildAppBar() {
     final actions = List<Widget>();
     final actions = List<Widget>();
-    if (_files[_selectedIndex].localId != null) {
+    if (_files[_selectedIndex].localID != null) {
       actions.add(_getFavoriteButton());
       actions.add(_getFavoriteButton());
     }
     }
     actions.add(PopupMenuButton(
     actions.add(PopupMenuButton(

+ 1 - 1
lib/ui/device_folders_gallery_widget.dart

@@ -86,7 +86,7 @@ class _DeviceFolderGalleryWidgetState extends State<DeviceFolderGalleryWidget> {
           .compareTo(first.thumbnail.creationTime);
           .compareTo(first.thumbnail.creationTime);
     });
     });
     if (FavoriteFilesRepository.instance.hasFavorites()) {
     if (FavoriteFilesRepository.instance.hasFavorites()) {
-      final file = await FilesDB.instance.getLatestFileAmongGeneratedIds(
+      final file = await FilesDB.instance.getLatestFileAmongGeneratedIDs(
           FavoriteFilesRepository.instance.getLiked().toList());
           FavoriteFilesRepository.instance.getLiked().toList());
       folders.insert(0,
       folders.insert(0,
           DeviceFolder("Favorites", "/Favorites", file, FavoriteItemsFilter()));
           DeviceFolder("Favorites", "/Favorites", file, FavoriteItemsFilter()));

+ 2 - 2
lib/ui/thumbnail_widget.dart

@@ -34,7 +34,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
 
 
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
-    if (widget.file.localId == null) {
+    if (widget.file.localID == null) {
       return _getNetworkImage();
       return _getNetworkImage();
     }
     }
 
 
@@ -120,7 +120,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
   @override
   @override
   void didUpdateWidget(ThumbnailWidget oldWidget) {
   void didUpdateWidget(ThumbnailWidget oldWidget) {
     super.didUpdateWidget(oldWidget);
     super.didUpdateWidget(oldWidget);
-    if (widget.file.generatedId != oldWidget.file.generatedId) {
+    if (widget.file.generatedID != oldWidget.file.generatedID) {
       setState(() {
       setState(() {
         _hasLoadedThumbnail = false;
         _hasLoadedThumbnail = false;
         _imageProvider = null;
         _imageProvider = null;

+ 2 - 2
lib/ui/video_widget.dart

@@ -36,7 +36,7 @@ class _VideoWidgetState extends State<VideoWidget> {
   @override
   @override
   void initState() {
   void initState() {
     super.initState();
     super.initState();
-    if (widget.file.localId == null) {
+    if (widget.file.localID == null) {
       _setVideoPlayerController(widget.file.getStreamUrl());
       _setVideoPlayerController(widget.file.getStreamUrl());
       _videoPlayerController.addListener(() {
       _videoPlayerController.addListener(() {
         if (_videoPlayerController.value.hasError) {
         if (_videoPlayerController.value.hasError) {
@@ -104,7 +104,7 @@ class _VideoWidgetState extends State<VideoWidget> {
   }
   }
 
 
   Widget _getThumbnail() {
   Widget _getThumbnail() {
-    final thumbnail = widget.file.localId == null
+    final thumbnail = widget.file.localID == null
         ? CachedNetworkImage(
         ? CachedNetworkImage(
             imageUrl: widget.file.getThumbnailUrl(),
             imageUrl: widget.file.getThumbnailUrl(),
             fit: BoxFit.contain,
             fit: BoxFit.contain,

+ 1 - 1
lib/ui/zoomable_image.dart

@@ -51,7 +51,7 @@ class _ZoomableImageState extends State<ZoomableImage>
 
 
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
-    if (widget.photo.localId == null) {
+    if (widget.photo.localID == null) {
       _loadNetworkImage();
       _loadNetworkImage();
     } else {
     } else {
       _loadLocalImage(context);
       _loadLocalImage(context);

+ 3 - 3
lib/utils/file_util.dart

@@ -9,7 +9,7 @@ import 'package:photos/models/file_type.dart';
 Future<void> deleteFiles(List<File> files,
 Future<void> deleteFiles(List<File> files,
     {bool deleteEveryWhere = false}) async {
     {bool deleteEveryWhere = false}) async {
   await PhotoManager.editor
   await PhotoManager.editor
-      .deleteWithIds(files.map((file) => file.localId).toList());
+      .deleteWithIds(files.map((file) => file.localID).toList());
   for (File file in files) {
   for (File file in files) {
     deleteEveryWhere
     deleteEveryWhere
         ? await FilesDB.instance.markForDeletion(file)
         ? await FilesDB.instance.markForDeletion(file)
@@ -21,7 +21,7 @@ void preloadFile(File file) {
   if (file.fileType == FileType.video) {
   if (file.fileType == FileType.video) {
     return;
     return;
   }
   }
-  if (file.localId == null) {
+  if (file.localID == null) {
     if (BytesLruCache.get(file) == null) {
     if (BytesLruCache.get(file) == null) {
       file.getBytes().then((data) {
       file.getBytes().then((data) {
         BytesLruCache.put(file, data);
         BytesLruCache.put(file, data);
@@ -39,7 +39,7 @@ void preloadFile(File file) {
 }
 }
 
 
 void preloadLocalFileThumbnail(File file) {
 void preloadLocalFileThumbnail(File file) {
-  if (file.localId == null ||
+  if (file.localID == null ||
       ThumbnailLruCache.get(file, THUMBNAIL_SMALL_SIZE) != null) {
       ThumbnailLruCache.get(file, THUMBNAIL_SMALL_SIZE) != null) {
     return;
     return;
   }
   }