File & FilesDB: Add pubMetadata

This commit is contained in:
Neeraj Gupta 2021-10-26 10:55:42 +05:30
parent 86de134cb5
commit 4e492396e4
No known key found for this signature in database
GPG key ID: 3C5A1684DC1729E1
3 changed files with 65 additions and 2 deletions

View file

@ -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<String> addPubMagicMetadataColumns() {
return [
'''
ALTER TABLE $table ADD COLUMN $columnPubMMdEncodedJson TEXT DEFAULT '{}';
''',
'''
ALTER TABLE $table ADD COLUMN $columnPubMMdVersion INTEGER DEFAULT 0;
'''
];
}
Future<void> 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<String, dynamic> 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;
}
}

View file

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

View file

@ -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<String, dynamic> toJson() {
final map = <String, dynamic>{};
map[kMagicKeyVisibility] = editedTime;
return map;
}
factory PubMagicMetadata.fromMap(Map<String, dynamic> map) {
if (map == null) return null;
return PubMagicMetadata(
editedTime: map[kPubMagicKeyEditedTime],
);
}
}