From 4e492396e42524c645210d135605005603094c05 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 26 Oct 2021 10:55:42 +0530 Subject: [PATCH] File & FilesDB: Add pubMetadata --- lib/db/files_db.dart | 28 +++++++++++++++++++++++++++- lib/models/file.dart | 11 ++++++++++- lib/models/magic_metadata.dart | 28 ++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart index 25cebe1b4..d2c9a56ed 100644 --- a/lib/db/files_db.dart +++ b/lib/db/files_db.dart @@ -56,6 +56,9 @@ class FilesDB { static final columnMMdEncodedJson = 'mmd_encoded_json'; static final columnMMdVersion = 'mmd_ver'; + static final columnPubMMdEncodedJson = 'pub_mmd_encoded_json'; + static final columnPubMMdVersion = 'pub_mmd_ver'; + // part of magic metadata // Only parse & store selected fields from JSON in separate columns if // we need to write query based on that field @@ -69,6 +72,7 @@ class FilesDB { ...addMetadataColumns(), ...addMagicMetadataColumns(), ...addUniqueConstraintOnCollectionFiles(), + ...addPubMagicMetadataColumns() ]; final dbConfig = MigrationConfig( @@ -276,6 +280,17 @@ class FilesDB { ]; } + static List addPubMagicMetadataColumns() { + return [ + ''' + ALTER TABLE $table ADD COLUMN $columnPubMMdEncodedJson TEXT DEFAULT '{}'; + ''', + ''' + ALTER TABLE $table ADD COLUMN $columnPubMMdVersion INTEGER DEFAULT 0; + ''' + ]; + } + Future clearTable() async { final db = await instance.database; await db.delete(table); @@ -1019,7 +1034,15 @@ class FilesDB { row[columnMMdEncodedJson] == file.mMdEncodedJson ?? '{}'; row[columnMMdVisibility] = file.magicMetadata?.visibility ?? kVisibilityVisible; - return row; + + row[columnPubMMdVersion] = file.pubMmdVersion ?? 0; + row[columnPubMMdEncodedJson] == file.pubMmdEncodedJson ?? '{}'; + if (file.pubMagicMetadata != null && + file.pubMagicMetadata.editedTime != null) { + // override existing creationTime to avoid re-writing all queries related + // to loading the gallery + row[columnCreationTime] = file.pubMagicMetadata.editedTime; + } } File _getFileFromRow(Map row) { @@ -1053,6 +1076,9 @@ class FilesDB { file.mMdVersion = row[columnMMdVersion] ?? 0; file.mMdEncodedJson = row[columnMMdEncodedJson] ?? '{}'; + + file.pubMmdVersion = row[columnPubMMdVersion] ?? 0; + file.pubMmdEncodedJson = row[columnPubMMdEncodedJson] ?? '{}'; return file; } } diff --git a/lib/models/file.dart b/lib/models/file.dart index 20732fa91..b4c557a77 100644 --- a/lib/models/file.dart +++ b/lib/models/file.dart @@ -1,13 +1,14 @@ import 'dart:io' as io; + import 'package:flutter/foundation.dart'; import 'package:flutter_sodium/flutter_sodium.dart'; import 'package:path/path.dart'; import 'package:photo_manager/photo_manager.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; -import 'package:photos/models/magic_metadata.dart'; import 'package:photos/models/file_type.dart'; import 'package:photos/models/location.dart'; +import 'package:photos/models/magic_metadata.dart'; import 'package:photos/services/feature_flag_service.dart'; import 'package:photos/utils/crypto_util.dart'; @@ -42,6 +43,14 @@ class File { _mmd ?? MagicMetadata.fromEncodedJson(mMdEncodedJson ?? '{}'); set magicMetadata(val) => _mmd = val; + // public magic metadata is shared if during file/album sharing + String pubMmdEncodedJson; + int pubMmdVersion = 0; + PubMagicMetadata _pubMmd; + PubMagicMetadata get pubMagicMetadata => + _pubMmd ?? MagicMetadata.fromEncodedJson(pubMmdEncodedJson ?? '{}'); + set pubMagicMetadata(val) => _pubMmd = val; + static const kCurrentMetadataVersion = 1; File(); diff --git a/lib/models/magic_metadata.dart b/lib/models/magic_metadata.dart index 711bc3e9d..1805d89f6 100644 --- a/lib/models/magic_metadata.dart +++ b/lib/models/magic_metadata.dart @@ -6,6 +6,8 @@ const kVisibilityArchive = 1; const kMagicKeyVisibility = 'visibility'; +const kPubMagicKeyEditedTime = 'et'; + class MagicMetadata { // 0 -> visible // 1 -> archived @@ -33,3 +35,29 @@ class MagicMetadata { ); } } + +class PubMagicMetadata { + // + int editedTime; + + PubMagicMetadata({this.editedTime}); + + factory PubMagicMetadata.fromEncodedJson(String encodedJson) => + PubMagicMetadata.fromJson(jsonDecode(encodedJson)); + + factory PubMagicMetadata.fromJson(dynamic json) => + PubMagicMetadata.fromMap(json); + + Map toJson() { + final map = {}; + map[kMagicKeyVisibility] = editedTime; + return map; + } + + factory PubMagicMetadata.fromMap(Map map) { + if (map == null) return null; + return PubMagicMetadata( + editedTime: map[kPubMagicKeyEditedTime], + ); + } +}