final all the vars!
This commit is contained in:
parent
3b8d8bb4fb
commit
06ec7cb658
89 changed files with 265 additions and 267 deletions
|
@ -15,6 +15,7 @@ linter:
|
|||
- prefer_const_constructors_in_immutables
|
||||
- prefer_const_declarations
|
||||
- prefer_const_literals_to_create_immutables
|
||||
- prefer_final_locals
|
||||
- require_trailing_commas
|
||||
- sized_box_for_whitespace
|
||||
- use_full_hex_values_for_flutter_colors
|
||||
|
|
6
lib/core/cache/lru_map.dart
vendored
6
lib/core/cache/lru_map.dart
vendored
|
@ -10,7 +10,7 @@ class LRUMap<K, V> {
|
|||
LRUMap(this._maxSize, [this._handler]);
|
||||
|
||||
V get(K key) {
|
||||
V value = _map.remove(key);
|
||||
final V value = _map.remove(key);
|
||||
if (value != null) {
|
||||
_map[key] = value;
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ class LRUMap<K, V> {
|
|||
_map.remove(key);
|
||||
_map[key] = value;
|
||||
if (_map.length > _maxSize) {
|
||||
K evictedKey = _map.keys.first;
|
||||
V evictedValue = _map.remove(evictedKey);
|
||||
final K evictedKey = _map.keys.first;
|
||||
final V evictedValue = _map.remove(evictedKey);
|
||||
if (_handler != null) {
|
||||
_handler(evictedKey, evictedValue);
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ class Configuration {
|
|||
_logger.warning(e);
|
||||
}
|
||||
tempDirectory.createSync(recursive: true);
|
||||
var tempDirectoryPath = (await getTemporaryDirectory()).path;
|
||||
final tempDirectoryPath = (await getTemporaryDirectory()).path;
|
||||
_thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache";
|
||||
io.Directory(_thumbnailCacheDirectory).createSync(recursive: true);
|
||||
_sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media";
|
||||
|
|
|
@ -23,7 +23,7 @@ extension SuperString on String {
|
|||
var start = 0;
|
||||
|
||||
while (true) {
|
||||
var stop = start + chunkSize;
|
||||
final stop = start + chunkSize;
|
||||
if (stop > length) break;
|
||||
yield substring(start, stop);
|
||||
start = stop;
|
||||
|
@ -37,7 +37,7 @@ extension SuperString on String {
|
|||
|
||||
extension SuperLogRecord on LogRecord {
|
||||
String toPrettyString([String extraLines]) {
|
||||
var header = "[$loggerName] [$level] [$time]";
|
||||
final header = "[$loggerName] [$level] [$time]";
|
||||
|
||||
var msg = "$header $message";
|
||||
|
||||
|
@ -236,7 +236,7 @@ class SuperLogging {
|
|||
extraLines = null;
|
||||
}
|
||||
|
||||
var str = config.prefix + " " + rec.toPrettyString(extraLines);
|
||||
final str = config.prefix + " " + rec.toPrettyString(extraLines);
|
||||
|
||||
// write to stdout
|
||||
printLog(str);
|
||||
|
@ -316,21 +316,21 @@ class SuperLogging {
|
|||
|
||||
// choose [logDir]
|
||||
if (dirPath.isEmpty) {
|
||||
var root = await getExternalStorageDirectory();
|
||||
final root = await getExternalStorageDirectory();
|
||||
dirPath = '${root.path}/logs';
|
||||
}
|
||||
|
||||
// create [logDir]
|
||||
var dir = Directory(dirPath);
|
||||
final dir = Directory(dirPath);
|
||||
await dir.create(recursive: true);
|
||||
|
||||
var files = <File>[];
|
||||
var dates = <File, DateTime>{};
|
||||
final files = <File>[];
|
||||
final dates = <File, DateTime>{};
|
||||
|
||||
// collect all log files with valid names
|
||||
await for (final file in dir.list()) {
|
||||
try {
|
||||
var date = config.dateFmt.parse(basename(file.path));
|
||||
final date = config.dateFmt.parse(basename(file.path));
|
||||
dates[file as File] = date;
|
||||
files.add(file);
|
||||
} on FormatException {}
|
||||
|
@ -363,7 +363,7 @@ class SuperLogging {
|
|||
static String appVersion;
|
||||
|
||||
static Future<String> getAppVersion() async {
|
||||
var pkgInfo = await PackageInfo.fromPlatform();
|
||||
final pkgInfo = await PackageInfo.fromPlatform();
|
||||
return "${pkgInfo.version}+${pkgInfo.buildNumber}";
|
||||
}
|
||||
|
||||
|
@ -372,7 +372,7 @@ class SuperLogging {
|
|||
if (!Platform.isAndroid) {
|
||||
return false;
|
||||
}
|
||||
var pkgName = (await PackageInfo.fromPlatform()).packageName;
|
||||
final pkgName = (await PackageInfo.fromPlatform()).packageName;
|
||||
return pkgName.startsWith("io.ente.photos.fdroid");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,8 +60,8 @@ class CollectionsDB {
|
|||
}
|
||||
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabaseWithMigration(path, dbConfig);
|
||||
}
|
||||
|
||||
|
@ -157,7 +157,7 @@ class CollectionsDB {
|
|||
|
||||
Future<List<dynamic>> insert(List<Collection> collections) async {
|
||||
final db = await instance.database;
|
||||
var batch = db.batch();
|
||||
final batch = db.batch();
|
||||
for (final collection in collections) {
|
||||
batch.insert(
|
||||
table,
|
||||
|
@ -202,7 +202,7 @@ class CollectionsDB {
|
|||
}
|
||||
|
||||
Map<String, dynamic> _getRowForCollection(Collection collection) {
|
||||
var row = <String, dynamic>{};
|
||||
final row = <String, dynamic>{};
|
||||
row[columnID] = collection.id;
|
||||
row[columnOwner] = collection.owner.toJson();
|
||||
row[columnEncryptedKey] = collection.encryptedKey;
|
||||
|
@ -230,7 +230,7 @@ class CollectionsDB {
|
|||
}
|
||||
|
||||
Collection _convertToCollection(Map<String, dynamic> row) {
|
||||
Collection result = Collection(
|
||||
final Collection result = Collection(
|
||||
row[columnID],
|
||||
User.fromJson(row[columnOwner]),
|
||||
row[columnEncryptedKey],
|
||||
|
|
|
@ -40,8 +40,8 @@ class FilesMigrationDB {
|
|||
|
||||
// this opens the database (and creates it if it doesn't exist)
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: _databaseVersion,
|
||||
|
|
|
@ -95,8 +95,8 @@ class FilesDB {
|
|||
|
||||
// this opens the database (and creates it if it doesn't exist)
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
_logger.info("DB path " + path);
|
||||
return await openDatabaseWithMigration(path, dbConfig);
|
||||
}
|
||||
|
@ -425,7 +425,7 @@ class FilesDB {
|
|||
limit: limit,
|
||||
);
|
||||
final files = _convertToFiles(results);
|
||||
List<File> deduplicatedFiles =
|
||||
final List<File> deduplicatedFiles =
|
||||
_deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
|
||||
return FileLoadResult(deduplicatedFiles, files.length == limit);
|
||||
}
|
||||
|
@ -451,7 +451,7 @@ class FilesDB {
|
|||
limit: limit,
|
||||
);
|
||||
final files = _convertToFiles(results);
|
||||
List<File> deduplicatedFiles =
|
||||
final List<File> deduplicatedFiles =
|
||||
_deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
|
||||
return FileLoadResult(deduplicatedFiles, files.length == limit);
|
||||
}
|
||||
|
@ -483,7 +483,7 @@ class FilesDB {
|
|||
limit: limit,
|
||||
);
|
||||
final files = _convertToFiles(results);
|
||||
List<File> deduplicatedFiles =
|
||||
final List<File> deduplicatedFiles =
|
||||
_deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
|
||||
return FileLoadResult(deduplicatedFiles, files.length == limit);
|
||||
}
|
||||
|
@ -674,7 +674,7 @@ class FilesDB {
|
|||
orderBy: '$columnCreationTime DESC',
|
||||
groupBy: columnLocalID,
|
||||
);
|
||||
var files = _convertToFiles(results);
|
||||
final files = _convertToFiles(results);
|
||||
// future-safe filter just to ensure that the query doesn't end up returning files
|
||||
// which should not be backed up
|
||||
files.removeWhere(
|
||||
|
@ -937,7 +937,7 @@ class FilesDB {
|
|||
|
||||
Future<int> collectionFileCount(int collectionID) async {
|
||||
final db = await instance.database;
|
||||
var count = Sqflite.firstIntValue(
|
||||
final count = Sqflite.firstIntValue(
|
||||
await db.rawQuery(
|
||||
'SELECT COUNT(*) FROM $table where $columnCollectionID = $collectionID',
|
||||
),
|
||||
|
@ -947,7 +947,7 @@ class FilesDB {
|
|||
|
||||
Future<int> fileCountWithVisibility(int visibility, int ownerID) async {
|
||||
final db = await instance.database;
|
||||
var count = Sqflite.firstIntValue(
|
||||
final count = Sqflite.firstIntValue(
|
||||
await db.rawQuery(
|
||||
'SELECT COUNT(*) FROM $table where $columnMMdVisibility = $visibility AND $columnOwnerID = $ownerID',
|
||||
),
|
||||
|
@ -1152,9 +1152,9 @@ class FilesDB {
|
|||
|
||||
Future<List<File>> getAllFilesFromDB() async {
|
||||
final db = await instance.database;
|
||||
List<Map<String, dynamic>> result = await db.query(table);
|
||||
List<File> files = _convertToFiles(result);
|
||||
List<File> deduplicatedFiles =
|
||||
final List<Map<String, dynamic>> result = await db.query(table);
|
||||
final List<File> files = _convertToFiles(result);
|
||||
final List<File> deduplicatedFiles =
|
||||
_deduplicatedAndFilterIgnoredFiles(files, null);
|
||||
return deduplicatedFiles;
|
||||
}
|
||||
|
|
|
@ -52,8 +52,8 @@ class IgnoredFilesDB {
|
|||
|
||||
// this opens the database (and creates it if it doesn't exist)
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: _databaseVersion,
|
||||
|
|
|
@ -25,8 +25,8 @@ class MemoriesDB {
|
|||
}
|
||||
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: _databaseVersion,
|
||||
|
@ -74,7 +74,7 @@ class MemoriesDB {
|
|||
}
|
||||
|
||||
Map<String, dynamic> _getRowForSeenMemory(Memory memory, int timestamp) {
|
||||
var row = <String, dynamic>{};
|
||||
final row = <String, dynamic>{};
|
||||
row[columnFileID] = memory.file.generatedID;
|
||||
row[columnSeenTime] = timestamp;
|
||||
return row;
|
||||
|
|
|
@ -26,8 +26,8 @@ class PublicKeysDB {
|
|||
}
|
||||
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: _databaseVersion,
|
||||
|
@ -72,7 +72,7 @@ class PublicKeysDB {
|
|||
}
|
||||
|
||||
Map<String, dynamic> _getRow(PublicKey key) {
|
||||
var row = <String, dynamic>{};
|
||||
final row = <String, dynamic>{};
|
||||
row[columnEmail] = key.email;
|
||||
row[columnPublicKey] = key.publicKey;
|
||||
return row;
|
||||
|
|
|
@ -85,8 +85,8 @@ class TrashDB {
|
|||
|
||||
// this opens the database (and creates it if it doesn't exist)
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
_logger.info("DB path " + path);
|
||||
return await openDatabase(
|
||||
path,
|
||||
|
@ -103,7 +103,7 @@ class TrashDB {
|
|||
// getRecentlyTrashedFile returns the file which was trashed recently
|
||||
Future<TrashFile> getRecentlyTrashedFile() async {
|
||||
final db = await instance.database;
|
||||
var rows = await db.query(
|
||||
final rows = await db.query(
|
||||
tableName,
|
||||
orderBy: '$columnTrashDeleteBy DESC',
|
||||
limit: 1,
|
||||
|
@ -116,7 +116,7 @@ class TrashDB {
|
|||
|
||||
Future<int> count() async {
|
||||
final db = await instance.database;
|
||||
var count = Sqflite.firstIntValue(
|
||||
final count = Sqflite.firstIntValue(
|
||||
await db.rawQuery('SELECT COUNT(*) FROM $tableName'),
|
||||
);
|
||||
return count;
|
||||
|
|
|
@ -24,8 +24,8 @@ class UploadLocksDB {
|
|||
}
|
||||
|
||||
Future<Database> _initDatabase() async {
|
||||
Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
String path = join(documentsDirectory.path, _databaseName);
|
||||
final Directory documentsDirectory = await getApplicationDocumentsDirectory();
|
||||
final String path = join(documentsDirectory.path, _databaseName);
|
||||
return await openDatabase(
|
||||
path,
|
||||
version: _databaseVersion,
|
||||
|
|
|
@ -10,11 +10,6 @@ final lightThemeData = ThemeData(
|
|||
iconTheme: const IconThemeData(color: Colors.black),
|
||||
primaryIconTheme:
|
||||
const IconThemeData(color: Colors.red, opacity: 1.0, size: 50.0),
|
||||
colorScheme: const ColorScheme.light(
|
||||
primary: Colors.black,
|
||||
secondary: Color.fromARGB(255, 163, 163, 163),
|
||||
),
|
||||
accentColor: const Color.fromRGBO(0, 0, 0, 0.6),
|
||||
outlinedButtonTheme: buildOutlinedButtonThemeData(
|
||||
bgDisabled: Colors.grey.shade500,
|
||||
bgEnabled: Colors.black,
|
||||
|
@ -78,7 +73,10 @@ final lightThemeData = ThemeData(
|
|||
? Colors.white
|
||||
: Colors.black;
|
||||
}),
|
||||
),
|
||||
), colorScheme: const ColorScheme.light(
|
||||
primary: Colors.black,
|
||||
secondary: Color.fromARGB(255, 163, 163, 163),
|
||||
).copyWith(secondary: const Color.fromRGBO(0, 0, 0, 0.6)),
|
||||
);
|
||||
|
||||
final darkThemeData = ThemeData(
|
||||
|
@ -89,8 +87,6 @@ final darkThemeData = ThemeData(
|
|||
primaryIconTheme:
|
||||
const IconThemeData(color: Colors.red, opacity: 1.0, size: 50.0),
|
||||
hintColor: Colors.grey,
|
||||
colorScheme: const ColorScheme.dark(primary: Colors.white),
|
||||
accentColor: const Color.fromRGBO(45, 194, 98, 0.2),
|
||||
buttonTheme: const ButtonThemeData().copyWith(
|
||||
buttonColor: const Color.fromRGBO(45, 194, 98, 1.0),
|
||||
),
|
||||
|
@ -154,7 +150,7 @@ final darkThemeData = ThemeData(
|
|||
return Colors.grey;
|
||||
}
|
||||
}),
|
||||
),
|
||||
), colorScheme: const ColorScheme.dark(primary: Colors.white).copyWith(secondary: const Color.fromRGBO(45, 194, 98, 0.2)),
|
||||
);
|
||||
|
||||
TextTheme _buildTextTheme(Color textColor) {
|
||||
|
|
|
@ -231,8 +231,8 @@ Future<void> _killBGTask([String taskId]) async {
|
|||
}
|
||||
|
||||
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||
bool isRunningInFG = await _isRunningInForeground(); // hb
|
||||
bool isInForeground = AppLifecycleService.instance.isForeground;
|
||||
final bool isRunningInFG = await _isRunningInForeground(); // hb
|
||||
final bool isInForeground = AppLifecycleService.instance.isForeground;
|
||||
if (_isProcessRunning) {
|
||||
_logger.info(
|
||||
"Background push received when app is alive and runningInFS: $isRunningInFG inForeground: $isInForeground",
|
||||
|
@ -259,18 +259,18 @@ Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
|||
}
|
||||
|
||||
Future<void> _logFGHeartBeatInfo() async {
|
||||
bool isRunningInFG = await _isRunningInForeground();
|
||||
final bool isRunningInFG = await _isRunningInForeground();
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.reload();
|
||||
var lastFGTaskHeartBeatTime = prefs.getInt(kLastFGTaskHeartBeatTime) ?? 0;
|
||||
String lastRun = lastFGTaskHeartBeatTime == 0
|
||||
final lastFGTaskHeartBeatTime = prefs.getInt(kLastFGTaskHeartBeatTime) ?? 0;
|
||||
final String lastRun = lastFGTaskHeartBeatTime == 0
|
||||
? 'never'
|
||||
: DateTime.fromMicrosecondsSinceEpoch(lastFGTaskHeartBeatTime).toString();
|
||||
_logger.info('isAlreaduunningFG: $isRunningInFG, last Beat: $lastRun');
|
||||
}
|
||||
|
||||
void _scheduleSuicide(Duration duration, [String taskID]) {
|
||||
var taskIDVal = taskID ?? 'no taskID';
|
||||
final taskIDVal = taskID ?? 'no taskID';
|
||||
_logger.warning("Schedule seppuku taskID: $taskIDVal");
|
||||
Future.delayed(duration, () {
|
||||
_logger.warning("TLE, committing seppuku for taskID: $taskIDVal");
|
||||
|
|
|
@ -85,7 +85,7 @@ class Collection {
|
|||
String mMdEncodedJson,
|
||||
int mMdVersion,
|
||||
}) {
|
||||
Collection result = Collection(
|
||||
final Collection result = Collection(
|
||||
id ?? this.id,
|
||||
owner ?? this.owner,
|
||||
encryptedKey ?? this.encryptedKey,
|
||||
|
|
|
@ -61,7 +61,7 @@ class File extends EnteFile {
|
|||
File();
|
||||
|
||||
static Future<File> fromAsset(String pathName, AssetEntity asset) async {
|
||||
File file = File();
|
||||
final File file = File();
|
||||
file.localID = asset.id;
|
||||
file.title = asset.title;
|
||||
file.deviceFolder = pathName;
|
||||
|
|
|
@ -9,7 +9,7 @@ class SelectedFiles extends ChangeNotifier {
|
|||
// To handle the cases, where the file might have changed due to upload
|
||||
// or any other update, using file.generatedID to track if this file was already
|
||||
// selected or not
|
||||
File alreadySelected = files.firstWhere(
|
||||
final File alreadySelected = files.firstWhere(
|
||||
(element) => element.generatedID == file.generatedID,
|
||||
orElse: () => null,
|
||||
);
|
||||
|
@ -24,7 +24,7 @@ class SelectedFiles extends ChangeNotifier {
|
|||
}
|
||||
|
||||
bool isFileSelected(File file) {
|
||||
File alreadySelected = files.firstWhere(
|
||||
final File alreadySelected = files.firstWhere(
|
||||
(element) => element.generatedID == file.generatedID,
|
||||
orElse: () => null,
|
||||
);
|
||||
|
@ -32,7 +32,7 @@ class SelectedFiles extends ChangeNotifier {
|
|||
}
|
||||
|
||||
bool isPartOfLastSection(File file) {
|
||||
File alreadySelected = lastSelections.firstWhere(
|
||||
final File alreadySelected = lastSelections.firstWhere(
|
||||
(element) => element.generatedID == file.generatedID,
|
||||
orElse: () => null,
|
||||
);
|
||||
|
|
|
@ -144,7 +144,7 @@ class Attributes {
|
|||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
var map = <String, dynamic>{};
|
||||
final map = <String, dynamic>{};
|
||||
map["isCancelled"] = isCancelled;
|
||||
map["customerID"] = customerID;
|
||||
return map;
|
||||
|
|
|
@ -308,7 +308,7 @@ class CollectionsService {
|
|||
// read the existing magic metadata and apply new updates to existing data
|
||||
// current update is simple replace. This will be enhanced in the future,
|
||||
// as required.
|
||||
Map<String, dynamic> jsonToUpdate =
|
||||
final Map<String, dynamic> jsonToUpdate =
|
||||
jsonDecode(collection.mMdEncodedJson ?? '{}');
|
||||
newMetadataUpdate.forEach((key, value) {
|
||||
jsonToUpdate[key] = value;
|
||||
|
@ -325,7 +325,7 @@ class CollectionsService {
|
|||
);
|
||||
// for required field, the json validator on golang doesn't treat 0 as valid
|
||||
// value. Instead of changing version to ptr, decided to start version with 1.
|
||||
int currentVersion = max(collection.mMdVersion, 1);
|
||||
final int currentVersion = max(collection.mMdVersion, 1);
|
||||
final params = UpdateMagicMetadataRequest(
|
||||
id: collection.id,
|
||||
magicMetadata: MetadataRequest(
|
||||
|
|
|
@ -18,7 +18,7 @@ class DeduplicationService {
|
|||
|
||||
Future<List<DuplicateFiles>> getDuplicateFiles() async {
|
||||
try {
|
||||
DuplicateFilesResponse dupes = await _fetchDuplicateFileIDs();
|
||||
final DuplicateFilesResponse dupes = await _fetchDuplicateFileIDs();
|
||||
final ids = <int>[];
|
||||
for (final dupe in dupes.duplicates) {
|
||||
ids.addAll(dupe.fileIDs);
|
||||
|
|
|
@ -53,7 +53,7 @@ class FavoritesService {
|
|||
|
||||
Future<void> removeFromFavorites(File file) async {
|
||||
final collectionID = await _getOrCreateFavoriteCollectionID();
|
||||
var fileID = file.uploadedFileID;
|
||||
final fileID = file.uploadedFileID;
|
||||
if (fileID == null) {
|
||||
// Do nothing, ignore
|
||||
} else {
|
||||
|
|
|
@ -94,7 +94,7 @@ class FeatureFlagService {
|
|||
}
|
||||
|
||||
bool _isInternalUserOrDebugBuild() {
|
||||
String email = Configuration.instance.getEmail();
|
||||
final String email = Configuration.instance.getEmail();
|
||||
return (email != null && email.endsWith("@ente.io")) || kDebugMode;
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ class FileMagicService {
|
|||
FileMagicService._privateConstructor();
|
||||
|
||||
Future<void> changeVisibility(List<File> files, int visibility) async {
|
||||
Map<String, dynamic> update = {kMagicKeyVisibility: visibility};
|
||||
final Map<String, dynamic> update = {kMagicKeyVisibility: visibility};
|
||||
await _updateMagicData(files, update);
|
||||
if (visibility == kVisibilityVisible) {
|
||||
// Force reload home gallery to pull in the now unarchived files
|
||||
|
@ -62,7 +62,7 @@ class FileMagicService {
|
|||
// read the existing magic metadata and apply new updates to existing data
|
||||
// current update is simple replace. This will be enhanced in the future,
|
||||
// as required.
|
||||
Map<String, dynamic> jsonToUpdate = jsonDecode(file.pubMmdEncodedJson);
|
||||
final Map<String, dynamic> jsonToUpdate = jsonDecode(file.pubMmdEncodedJson);
|
||||
newMetadataUpdate.forEach((key, value) {
|
||||
jsonToUpdate[key] = value;
|
||||
});
|
||||
|
@ -132,7 +132,7 @@ class FileMagicService {
|
|||
// read the existing magic metadata and apply new updates to existing data
|
||||
// current update is simple replace. This will be enhanced in the future,
|
||||
// as required.
|
||||
Map<String, dynamic> jsonToUpdate = jsonDecode(file.mMdEncodedJson);
|
||||
final Map<String, dynamic> jsonToUpdate = jsonDecode(file.mMdEncodedJson);
|
||||
newMetadataUpdate.forEach((key, value) {
|
||||
jsonToUpdate[key] = value;
|
||||
});
|
||||
|
@ -224,7 +224,7 @@ class MetadataRequest {
|
|||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
var map = <String, dynamic>{};
|
||||
final map = <String, dynamic>{};
|
||||
map['version'] = version;
|
||||
map['count'] = count;
|
||||
map['data'] = data;
|
||||
|
|
|
@ -63,14 +63,14 @@ class FileMigrationService {
|
|||
}
|
||||
// migration only needs to run if Android API Level is 29 or higher
|
||||
final int version = int.parse(await PhotoManager.systemVersion());
|
||||
bool isMigrationRequired = version >= 29;
|
||||
final bool isMigrationRequired = version >= 29;
|
||||
if (isMigrationRequired) {
|
||||
await _importLocalFilesForMigration();
|
||||
final sTime = DateTime.now().microsecondsSinceEpoch;
|
||||
bool hasData = true;
|
||||
const int limitInBatch = 100;
|
||||
while (hasData) {
|
||||
var localIDsToProcess = await _filesMigrationDB
|
||||
final localIDsToProcess = await _filesMigrationDB
|
||||
.getLocalIDsForPotentialReUpload(limitInBatch);
|
||||
if (localIDsToProcess.isEmpty) {
|
||||
hasData = false;
|
||||
|
@ -91,15 +91,15 @@ class FileMigrationService {
|
|||
List<String> localIDsToProcess,
|
||||
) async {
|
||||
_logger.info("files to process ${localIDsToProcess.length}");
|
||||
var localIDsWithLocation = <String>[];
|
||||
final localIDsWithLocation = <String>[];
|
||||
for (var localID in localIDsToProcess) {
|
||||
bool hasLocation = false;
|
||||
try {
|
||||
var assetEntity = await AssetEntity.fromId(localID);
|
||||
final assetEntity = await AssetEntity.fromId(localID);
|
||||
if (assetEntity == null) {
|
||||
continue;
|
||||
}
|
||||
var latLng = await assetEntity.latlngAsync();
|
||||
final latLng = await assetEntity.latlngAsync();
|
||||
if ((latLng.longitude ?? 0.0) != 0.0 ||
|
||||
(latLng.longitude ?? 0.0) != 0.0) {
|
||||
_logger.finest(
|
||||
|
@ -125,7 +125,7 @@ class FileMigrationService {
|
|||
}
|
||||
final sTime = DateTime.now().microsecondsSinceEpoch;
|
||||
_logger.info('importing files without location info');
|
||||
var fileLocalIDs = await _filesDB.getLocalFilesBackedUpWithoutLocation();
|
||||
final fileLocalIDs = await _filesDB.getLocalFilesBackedUpWithoutLocation();
|
||||
await _filesMigrationDB.insertMultiple(fileLocalIDs);
|
||||
final eTime = DateTime.now().microsecondsSinceEpoch;
|
||||
final d = Duration(microseconds: eTime - sTime);
|
||||
|
|
|
@ -162,7 +162,7 @@ class LocalSyncService {
|
|||
if (_prefs.containsKey(kEditedFileIDsKey)) {
|
||||
return _prefs.getStringList(kEditedFileIDsKey);
|
||||
} else {
|
||||
List<String> editedIDs = [];
|
||||
final List<String> editedIDs = [];
|
||||
return editedIDs;
|
||||
}
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ class LocalSyncService {
|
|||
if (_prefs.containsKey(kDownloadedFileIDsKey)) {
|
||||
return _prefs.getStringList(kDownloadedFileIDsKey);
|
||||
} else {
|
||||
List<String> downloadedIDs = [];
|
||||
final List<String> downloadedIDs = [];
|
||||
return downloadedIDs;
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ class LocalSyncService {
|
|||
if (_prefs.containsKey(kInvalidFileIDsKey)) {
|
||||
return _prefs.getStringList(kInvalidFileIDsKey);
|
||||
} else {
|
||||
List<String> invalidIDs = [];
|
||||
final List<String> invalidIDs = [];
|
||||
return invalidIDs;
|
||||
}
|
||||
}
|
||||
|
@ -273,9 +273,9 @@ class LocalSyncService {
|
|||
);
|
||||
try {
|
||||
if (Platform.isIOS) {
|
||||
var assetEntity = await AssetEntity.fromId(file.localID);
|
||||
final assetEntity = await AssetEntity.fromId(file.localID);
|
||||
if (assetEntity != null) {
|
||||
var isLocallyAvailable =
|
||||
final isLocallyAvailable =
|
||||
await assetEntity.isLocallyAvailable(isOrigin: true);
|
||||
_logger.info(
|
||||
're-upload asset ${file.toString()} with localAvailableFlag '
|
||||
|
|
|
@ -265,7 +265,7 @@ class RemoteSyncService {
|
|||
_logger.info(editedFiles.length.toString() + " files edited.");
|
||||
|
||||
_completedUploads = 0;
|
||||
int toBeUploaded =
|
||||
final int toBeUploaded =
|
||||
filesToBeUploaded.length + updatedFileIDs.length + editedFiles.length;
|
||||
|
||||
if (toBeUploaded > 0) {
|
||||
|
@ -374,8 +374,8 @@ class RemoteSyncService {
|
|||
localButUpdatedOnRemote = 0,
|
||||
localButAddedToNewCollectionOnRemote = 0;
|
||||
bool hasAnyCreationTimeChanged = false;
|
||||
List<File> toBeInserted = [];
|
||||
int userID = Configuration.instance.getUserID();
|
||||
final List<File> toBeInserted = [];
|
||||
final int userID = Configuration.instance.getUserID();
|
||||
for (File file in diff) {
|
||||
final existingFiles = file.deviceFolder == null
|
||||
? null
|
||||
|
@ -420,7 +420,7 @@ class RemoteSyncService {
|
|||
} else {
|
||||
file.localID = null;
|
||||
}
|
||||
bool wasUploadedOnAPreviousInstallation =
|
||||
final bool wasUploadedOnAPreviousInstallation =
|
||||
existingFiles.length == 1 && existingFiles[0].collectionID == null;
|
||||
if (wasUploadedOnAPreviousInstallation) {
|
||||
file.generatedID = existingFiles[0].generatedID;
|
||||
|
|
|
@ -806,7 +806,7 @@ class UserService {
|
|||
|
||||
Future<String> getPaymentToken() async {
|
||||
try {
|
||||
var response = await _dio.get(
|
||||
final response = await _dio.get(
|
||||
"${_config.getHttpEndpoint()}/users/payment-token",
|
||||
options: Options(
|
||||
headers: {
|
||||
|
@ -827,7 +827,7 @@ class UserService {
|
|||
|
||||
Future<String> getFamiliesToken() async {
|
||||
try {
|
||||
var response = await _dio.get(
|
||||
final response = await _dio.get(
|
||||
"${_config.getHttpEndpoint()}/users/families-token",
|
||||
options: Options(
|
||||
headers: {
|
||||
|
|
|
@ -145,7 +145,7 @@ class DeleteAccountPage extends StatelessWidget {
|
|||
DeleteChallengeResponse response,
|
||||
) async {
|
||||
AppLock.of(context).setEnabled(false);
|
||||
String reason = "Please authenticate to initiate account deletion";
|
||||
const String reason = "Please authenticate to initiate account deletion";
|
||||
final result = await requestAuthentication(reason);
|
||||
AppLock.of(context).setEnabled(
|
||||
Configuration.instance.shouldShowLockScreen(),
|
||||
|
@ -177,7 +177,7 @@ class DeleteAccountPage extends StatelessWidget {
|
|||
}
|
||||
|
||||
Future<void> _requestEmailForDeletion(BuildContext context) async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text(
|
||||
"Delete account",
|
||||
style: TextStyle(
|
||||
|
|
|
@ -79,7 +79,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
|||
_logger.severe("Password verification failed", e, s);
|
||||
await dialog.hide();
|
||||
|
||||
var dialogUserChoice = await showChoiceDialog(
|
||||
final dialogUserChoice = await showChoiceDialog(
|
||||
context,
|
||||
"Incorrect password",
|
||||
"Please try again",
|
||||
|
|
|
@ -186,7 +186,7 @@ class _RecoveryKeyPageState extends State<RecoveryKeyPage> {
|
|||
}
|
||||
|
||||
List<Widget> _saveOptions(BuildContext context, String recoveryKey) {
|
||||
List<Widget> childrens = [];
|
||||
final List<Widget> childrens = [];
|
||||
if (!_hasTriedToSave) {
|
||||
childrens.add(
|
||||
ElevatedButton(
|
||||
|
|
|
@ -41,7 +41,7 @@ class _SessionsPageState extends State<SessionsPage> {
|
|||
if (_sessions == null) {
|
||||
return const Center(child: EnteLoadingWidget());
|
||||
}
|
||||
List<Widget> rows = [];
|
||||
final List<Widget> rows = [];
|
||||
rows.add(const Padding(padding: EdgeInsets.all(4)));
|
||||
for (final session in _sessions.sessions) {
|
||||
rows.add(_getSessionWidget(session));
|
||||
|
@ -163,7 +163,7 @@ class _SessionsPageState extends State<SessionsPage> {
|
|||
),
|
||||
);
|
||||
}
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Terminate session?"),
|
||||
content: text,
|
||||
actions: [
|
||||
|
|
|
@ -116,7 +116,7 @@ class _TwoFactorSetupPageState extends State<TwoFactorSetupPage>
|
|||
Divider(
|
||||
height: 1,
|
||||
thickness: 1,
|
||||
color: Theme.of(context).accentColor,
|
||||
color: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
_getVerificationWidget(),
|
||||
],
|
||||
|
@ -126,7 +126,7 @@ class _TwoFactorSetupPageState extends State<TwoFactorSetupPage>
|
|||
}
|
||||
|
||||
Widget _getSecretCode() {
|
||||
Color textColor = Theme.of(context).colorScheme.onSurface;
|
||||
final Color textColor = Theme.of(context).colorScheme.onSurface;
|
||||
return GestureDetector(
|
||||
onTap: () async {
|
||||
await Clipboard.setData(ClipboardData(text: widget.secretCode));
|
||||
|
|
|
@ -19,11 +19,11 @@ class CollectionItem extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
const double horizontalPaddingOfGridRow = 16;
|
||||
const double crossAxisSpacingOfGrid = 9;
|
||||
Size size = MediaQuery.of(context).size;
|
||||
int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
final Size size = MediaQuery.of(context).size;
|
||||
final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
(albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
|
||||
TextStyle albumTitleTextStyle =
|
||||
final TextStyle albumTitleTextStyle =
|
||||
Theme.of(context).textTheme.subtitle1.copyWith(fontSize: 14);
|
||||
final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
|
||||
(totalWhiteSpaceOfRow / albumsCountInOneRow);
|
||||
|
|
|
@ -17,8 +17,8 @@ class RemoteCollectionsGridViewWidget extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
const double horizontalPaddingOfGridRow = 16;
|
||||
const double crossAxisSpacingOfGrid = 9;
|
||||
Size size = MediaQuery.of(context).size;
|
||||
int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
final Size size = MediaQuery.of(context).size;
|
||||
final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
|
||||
horizontalPaddingOfGridRow -
|
||||
((crossAxisSpacingOfGrid / 2) * (albumsCountInOneRow - 1));
|
||||
|
|
|
@ -19,7 +19,7 @@ Future<DialogUserChoice> showChoiceDialog<T>(
|
|||
Color secondActionColor,
|
||||
ActionType actionType = ActionType.confirm,
|
||||
}) {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
|
|
|
@ -202,7 +202,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
|
|||
}
|
||||
|
||||
void _showNameAlbumDialog() async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Album title"),
|
||||
content: TextFormField(
|
||||
decoration: const InputDecoration(
|
||||
|
@ -284,7 +284,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
|
|||
final dialog = createProgressDialog(context, "Moving files to album...");
|
||||
await dialog.show();
|
||||
try {
|
||||
int fromCollectionID = widget.selectedFiles.files?.first?.collectionID;
|
||||
final int fromCollectionID = widget.selectedFiles.files?.first?.collectionID;
|
||||
await CollectionsService.instance.move(
|
||||
toCollectionID,
|
||||
fromCollectionID,
|
||||
|
|
|
@ -94,7 +94,7 @@ class GrantPermissionsWidget extends StatelessWidget {
|
|||
state == PermissionState.limited) {
|
||||
await SyncService.instance.onPermissionGranted(state);
|
||||
} else if (state == PermissionState.denied) {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Please grant permissions"),
|
||||
content: const Text(
|
||||
"ente can encrypt and preserve files only if you grant access to them",
|
||||
|
|
|
@ -123,7 +123,7 @@ class _HomeWidgetState extends State<HomeWidget> {
|
|||
});
|
||||
_triggerLogoutEvent =
|
||||
Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Session expired"),
|
||||
content: const Text("Please login again"),
|
||||
actions: [
|
||||
|
@ -344,7 +344,7 @@ class _HomeWidgetState extends State<HomeWidget> {
|
|||
Future<bool> _initDeepLinks() async {
|
||||
// Platform messages may fail, so we use a try/catch PlatformException.
|
||||
try {
|
||||
String initialLink = await getInitialLink();
|
||||
final String initialLink = await getInitialLink();
|
||||
// Parse the link and warn the user, if it is not correct,
|
||||
// but keep in mind it could be `null`.
|
||||
if (initialLink != null) {
|
||||
|
@ -609,7 +609,7 @@ class _HomeBottomNavigationBarState extends State<HomeBottomNavigationBar> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
|
||||
final bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
|
||||
return AnimatedContainer(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.easeInOut,
|
||||
|
|
|
@ -175,7 +175,7 @@ class DraggableScrollbarState extends State<DraggableScrollbar>
|
|||
if (isDragging && details.delta.dy != 0) {
|
||||
thumbOffset += details.delta.dy;
|
||||
thumbOffset = thumbOffset.clamp(thumbMin, thumbMax);
|
||||
double position = thumbOffset / (thumbMax - thumbMin);
|
||||
final double position = thumbOffset / (thumbMax - thumbMin);
|
||||
widget.onChange?.call(position);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -97,7 +97,7 @@ class HugeListViewState<T> extends State<HugeListView<T>> {
|
|||
}
|
||||
|
||||
void _sendScroll() {
|
||||
int current = _currentFirst();
|
||||
final int current = _currentFirst();
|
||||
widget.firstShown?.call(current);
|
||||
scrollKey.currentState?.setPosition(current / widget.totalCount, current);
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
|||
|
||||
_currentIndexSubscription =
|
||||
widget.currentIndexStream.listen((currentIndex) {
|
||||
bool shouldRender = (currentIndex - widget.index).abs() <
|
||||
final bool shouldRender = (currentIndex - widget.index).abs() <
|
||||
kNumberOfDaysToRenderBeforeAndAfter;
|
||||
if (mounted && shouldRender != _shouldRender) {
|
||||
setState(() {
|
||||
|
@ -163,7 +163,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
|
|||
}
|
||||
|
||||
Widget _getGallery() {
|
||||
List<Widget> childGalleries = [];
|
||||
final List<Widget> childGalleries = [];
|
||||
for (int index = 0; index < _files.length; index += kSubGalleryItemLimit) {
|
||||
childGalleries.add(
|
||||
LazyLoadingGridView(
|
||||
|
|
|
@ -66,9 +66,9 @@ class MemoriesWidget extends StatelessWidget {
|
|||
}
|
||||
|
||||
bool _areMemoriesFromSameYear(Memory first, Memory second) {
|
||||
var firstDate =
|
||||
final firstDate =
|
||||
DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime);
|
||||
var secondDate =
|
||||
final secondDate =
|
||||
DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime);
|
||||
return firstDate.year == secondDate.year;
|
||||
}
|
||||
|
|
|
@ -321,7 +321,7 @@ class _ButtonState extends State<Button> with TickerProviderStateMixin {
|
|||
expandController.forward();
|
||||
}
|
||||
|
||||
Widget icon = widget.leading ??
|
||||
final Widget icon = widget.leading ??
|
||||
Icon(
|
||||
widget.icon,
|
||||
color: _expanded ? widget.iconColor : widget.iconActiveColor,
|
||||
|
|
|
@ -77,7 +77,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
|||
),
|
||||
),
|
||||
shouldOverrideUrlLoading: (controller, navigationAction) async {
|
||||
var loadingUri = navigationAction.request.url;
|
||||
final loadingUri = navigationAction.request.url;
|
||||
_logger.info("Loading url $loadingUri");
|
||||
// handle the payment response
|
||||
if (_isPaymentActionComplete(loadingUri)) {
|
||||
|
@ -130,7 +130,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
|||
'action': widget.actionType,
|
||||
'redirectURL': kWebPaymentRedirectUrl,
|
||||
};
|
||||
var tryParse = Uri.tryParse(kWebPaymentBaseEndpoint);
|
||||
final tryParse = Uri.tryParse(kWebPaymentBaseEndpoint);
|
||||
if (kDebugMode && kWebPaymentBaseEndpoint.startsWith("http://")) {
|
||||
return Uri.http(tryParse.authority, tryParse.path, queryParameters);
|
||||
} else {
|
||||
|
@ -173,13 +173,13 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
|||
}
|
||||
|
||||
Future<void> _handlePaymentResponse(Uri uri) async {
|
||||
var queryParams = uri.queryParameters;
|
||||
var paymentStatus = uri.queryParameters['status'] ?? '';
|
||||
final queryParams = uri.queryParameters;
|
||||
final paymentStatus = uri.queryParameters['status'] ?? '';
|
||||
_logger.fine('handle payment response with status $paymentStatus');
|
||||
if (paymentStatus == 'success') {
|
||||
await _handlePaymentSuccess(queryParams);
|
||||
} else if (paymentStatus == 'fail') {
|
||||
var reason = queryParams['reason'] ?? '';
|
||||
final reason = queryParams['reason'] ?? '';
|
||||
await _handlePaymentFailure(reason);
|
||||
} else {
|
||||
// should never reach here
|
||||
|
@ -210,17 +210,17 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
|||
|
||||
// return true if verifySubscription didn't throw any exceptions
|
||||
Future<void> _handlePaymentSuccess(Map<String, String> queryParams) async {
|
||||
var checkoutSessionID = queryParams['session_id'] ?? '';
|
||||
final checkoutSessionID = queryParams['session_id'] ?? '';
|
||||
await _dialog.show();
|
||||
try {
|
||||
var response = await billingService.verifySubscription(
|
||||
final response = await billingService.verifySubscription(
|
||||
widget.planId,
|
||||
checkoutSessionID,
|
||||
paymentProvider: kStripe,
|
||||
);
|
||||
await _dialog.hide();
|
||||
if (response != null) {
|
||||
var content = widget.actionType == 'buy'
|
||||
final content = widget.actionType == 'buy'
|
||||
? 'Your purchase was successful'
|
||||
: 'Your subscription was updated successfully';
|
||||
await _showExitPageDialog(title: 'Thank you', content: content);
|
||||
|
|
|
@ -307,7 +307,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
|||
Future<void> _launchStripePortal() async {
|
||||
await _dialog.show();
|
||||
try {
|
||||
String url = await _billingService.getStripeCustomerPortalUrl();
|
||||
final String url = await _billingService.getStripeCustomerPortalUrl();
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) {
|
||||
|
@ -353,9 +353,9 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
|||
}
|
||||
|
||||
Widget _stripeRenewOrCancelButton() {
|
||||
bool isRenewCancelled =
|
||||
final bool isRenewCancelled =
|
||||
_currentSubscription.attributes?.isCancelled ?? false;
|
||||
String title =
|
||||
final String title =
|
||||
isRenewCancelled ? "Renew subscription" : "Cancel subscription";
|
||||
return TextButton(
|
||||
child: Text(
|
||||
|
@ -370,7 +370,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
|||
onPressed: () async {
|
||||
bool confirmAction = false;
|
||||
if (isRenewCancelled) {
|
||||
var choice = await showChoiceDialog(
|
||||
final choice = await showChoiceDialog(
|
||||
context,
|
||||
title,
|
||||
"Are you sure you want to renew?",
|
||||
|
@ -379,7 +379,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
|||
);
|
||||
confirmAction = choice == DialogUserChoice.secondChoice;
|
||||
} else {
|
||||
var choice = await showChoiceDialog(
|
||||
final choice = await showChoiceDialog(
|
||||
context,
|
||||
title,
|
||||
'Are you sure you want to cancel?',
|
||||
|
@ -455,7 +455,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
|||
String stripPurChaseAction = 'buy';
|
||||
if (_isStripeSubscriber && _hasActiveSubscription) {
|
||||
// confirm if user wants to change plan or not
|
||||
var result = await showChoiceDialog(
|
||||
final result = await showChoiceDialog(
|
||||
context,
|
||||
"Confirm plan change",
|
||||
"Are you sure you want to change your plan?",
|
||||
|
|
|
@ -87,7 +87,7 @@ class ValidityWidget extends StatelessWidget {
|
|||
if (currentSubscription == null) {
|
||||
return Container();
|
||||
}
|
||||
var endDate = getDateAndMonthAndYear(
|
||||
final endDate = getDateAndMonthAndYear(
|
||||
DateTime.fromMicrosecondsSinceEpoch(currentSubscription.expiryTime),
|
||||
);
|
||||
var message = "Renews on $endDate";
|
||||
|
|
|
@ -16,13 +16,13 @@ class SubscriptionPlanWidget extends StatelessWidget {
|
|||
final bool isActive;
|
||||
|
||||
String _displayPrice() {
|
||||
var result = price + (period.isNotEmpty ? " / " + period : "");
|
||||
final result = price + (period.isNotEmpty ? " / " + period : "");
|
||||
return result.isNotEmpty ? result : "Trial plan";
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Color textColor = isActive ? Colors.white : Colors.black;
|
||||
final Color textColor = isActive ? Colors.white : Colors.black;
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
|
|
|
@ -40,7 +40,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
|
|||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
AppLock.of(context).setEnabled(false);
|
||||
String reason = "Please authenticate to view your recovery key";
|
||||
const String reason = "Please authenticate to view your recovery key";
|
||||
final result = await requestAuthentication(reason);
|
||||
AppLock.of(context)
|
||||
.setEnabled(Configuration.instance.shouldShowLockScreen());
|
||||
|
@ -76,7 +76,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
|
|||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
AppLock.of(context).setEnabled(false);
|
||||
String reason = "Please authenticate to change your email";
|
||||
const String reason = "Please authenticate to change your email";
|
||||
final result = await requestAuthentication(reason);
|
||||
AppLock.of(context)
|
||||
.setEnabled(Configuration.instance.shouldShowLockScreen());
|
||||
|
@ -103,7 +103,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
|
|||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
AppLock.of(context).setEnabled(false);
|
||||
String reason = "Please authenticate to change your password";
|
||||
const String reason = "Please authenticate to change your password";
|
||||
final result = await requestAuthentication(reason);
|
||||
AppLock.of(context)
|
||||
.setEnabled(Configuration.instance.shouldShowLockScreen());
|
||||
|
|
|
@ -153,7 +153,7 @@ class _ApkDownloaderDialogState extends State<ApkDownloaderDialog> {
|
|||
OpenFile.open(_saveUrl);
|
||||
} catch (e) {
|
||||
Logger("ApkDownloader").severe(e);
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Sorry"),
|
||||
content: const Text("The download could not be completed"),
|
||||
actions: [
|
||||
|
|
|
@ -25,7 +25,7 @@ class _AppVersionWidgetState extends State<AppVersionWidget> {
|
|||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () async {
|
||||
int now = DateTime.now().millisecondsSinceEpoch;
|
||||
final int now = DateTime.now().millisecondsSinceEpoch;
|
||||
if (now - (_lastTap ?? now) < kConsecutiveTapTimeWindowInMilliseconds) {
|
||||
_consecutiveTaps++;
|
||||
if (_consecutiveTaps == kTapThresholdForInspector) {
|
||||
|
|
|
@ -113,7 +113,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
value: Configuration.instance.shouldKeepDeviceAwake(),
|
||||
onChanged: (value) async {
|
||||
if (value) {
|
||||
var choice = await showChoiceDialog(
|
||||
final choice = await showChoiceDialog(
|
||||
context,
|
||||
"Disable automatic screen lock when ente is running?",
|
||||
"This will ensure faster uploads by ensuring your device does not sleep when uploads are in progress.",
|
||||
|
@ -158,7 +158,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
"You've no files on this device that can be deleted",
|
||||
);
|
||||
} else {
|
||||
bool result = await routeToPage(context, FreeSpacePage(status));
|
||||
final bool result = await routeToPage(context, FreeSpacePage(status));
|
||||
if (result == true) {
|
||||
_showSpaceFreedDialog(status);
|
||||
}
|
||||
|
@ -193,7 +193,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
"You've no duplicate files that can be cleared",
|
||||
);
|
||||
} else {
|
||||
DeduplicationResult result =
|
||||
final DeduplicationResult result =
|
||||
await routeToPage(context, DeduplicatePage(duplicates));
|
||||
if (result != null) {
|
||||
_showDuplicateFilesDeletedDialog(result);
|
||||
|
@ -213,7 +213,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
}
|
||||
|
||||
void _showSpaceFreedDialog(BackupStatus status) {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Success"),
|
||||
content: Text(
|
||||
"You have successfully freed up " + formatBytes(status.size) + "!",
|
||||
|
@ -268,10 +268,10 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
|
|||
}
|
||||
|
||||
void _showDuplicateFilesDeletedDialog(DeduplicationResult result) {
|
||||
String countText = result.count.toString() +
|
||||
final String countText = result.count.toString() +
|
||||
" duplicate file" +
|
||||
(result.count == 1 ? "" : "s");
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("✨ Success"),
|
||||
content: Text(
|
||||
"You have cleaned up " +
|
||||
|
|
|
@ -53,7 +53,7 @@ class _DangerSectionWidgetState extends State<DangerSectionWidget> {
|
|||
}
|
||||
|
||||
Future<void> _onLogoutTapped() async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text(
|
||||
"Logout",
|
||||
style: TextStyle(
|
||||
|
|
|
@ -48,7 +48,7 @@ class DebugSectionWidget extends StatelessWidget {
|
|||
|
||||
void _showKeyAttributesDialog(BuildContext context) {
|
||||
final keyAttributes = Configuration.instance.getKeyAttributes();
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("key attributes"),
|
||||
content: SingleChildScrollView(
|
||||
child: Column(
|
||||
|
|
|
@ -83,7 +83,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
|||
value: snapshot.data,
|
||||
onChanged: (value) async {
|
||||
AppLock.of(context).setEnabled(false);
|
||||
String reason =
|
||||
const String reason =
|
||||
"Please authenticate to configure two-factor authentication";
|
||||
final result = await requestAuthentication(reason);
|
||||
AppLock.of(context).setEnabled(
|
||||
|
@ -164,7 +164,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
|||
value: _config.shouldHideFromRecents(),
|
||||
onChanged: (value) async {
|
||||
if (value) {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Hide from recents?"),
|
||||
content: SingleChildScrollView(
|
||||
child: Column(
|
||||
|
@ -278,7 +278,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
|
|||
}
|
||||
|
||||
void _disableTwoFactor() {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Disable two-factor"),
|
||||
content: const Text(
|
||||
"Are you sure you want to disable two-factor authentication?",
|
||||
|
|
|
@ -22,7 +22,7 @@ class SocialSectionWidget extends StatelessWidget {
|
|||
}
|
||||
|
||||
Widget _getSectionOptions(BuildContext context) {
|
||||
List<Widget> options = [
|
||||
final List<Widget> options = [
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
|
|
|
@ -112,9 +112,9 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
|
|||
Widget _getSharedCollectionsGallery(SharedCollections collections) {
|
||||
const double horizontalPaddingOfGridRow = 16;
|
||||
const double crossAxisSpacingOfGrid = 9;
|
||||
Size size = MediaQuery.of(context).size;
|
||||
int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
final Size size = MediaQuery.of(context).size;
|
||||
final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
(albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
|
||||
final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
|
||||
(totalWhiteSpaceOfRow / albumsCountInOneRow);
|
||||
|
@ -363,11 +363,11 @@ class IncomingCollectionItem extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
const double horizontalPaddingOfGridRow = 16;
|
||||
const double crossAxisSpacingOfGrid = 9;
|
||||
TextStyle albumTitleTextStyle =
|
||||
final TextStyle albumTitleTextStyle =
|
||||
Theme.of(context).textTheme.subtitle1.copyWith(fontSize: 14);
|
||||
Size size = MediaQuery.of(context).size;
|
||||
int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
final Size size = MediaQuery.of(context).size;
|
||||
final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||||
final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||||
(albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
|
||||
final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
|
||||
(totalWhiteSpaceOfRow / albumsCountInOneRow);
|
||||
|
|
|
@ -131,12 +131,12 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
false,
|
||||
onChanged: (enablePassword) async {
|
||||
if (enablePassword) {
|
||||
var inputResult =
|
||||
final inputResult =
|
||||
await _displayLinkPasswordInput(context);
|
||||
if (inputResult != null &&
|
||||
inputResult == 'ok' &&
|
||||
_textFieldController.text.trim().isNotEmpty) {
|
||||
var propToUpdate = await _getEncryptedPassword(
|
||||
final propToUpdate = await _getEncryptedPassword(
|
||||
_textFieldController.text,
|
||||
);
|
||||
await _updateUrlSettings(context, propToUpdate);
|
||||
|
@ -250,10 +250,10 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
CupertinoButton(
|
||||
onPressed: () async {
|
||||
int newValidTill = -1;
|
||||
int expireAfterInMicroseconds = _selectedExpiry.item3;
|
||||
final int expireAfterInMicroseconds = _selectedExpiry.item3;
|
||||
// need to manually select time
|
||||
if (expireAfterInMicroseconds < 0) {
|
||||
var timeInMicrosecondsFromEpoch =
|
||||
final timeInMicrosecondsFromEpoch =
|
||||
await _showDateTimePicker();
|
||||
if (timeInMicrosecondsFromEpoch != null) {
|
||||
newValidTill = timeInMicrosecondsFromEpoch;
|
||||
|
@ -293,7 +293,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
backgroundColor:
|
||||
Theme.of(context).backgroundColor.withOpacity(0.95),
|
||||
onSelectedItemChanged: (value) {
|
||||
var firstWhere = _expiryOptions
|
||||
final firstWhere = _expiryOptions
|
||||
.firstWhere((element) => element.item1 == value);
|
||||
setState(() {
|
||||
_selectedExpiry = firstWhere;
|
||||
|
@ -410,8 +410,8 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
Sodium.cryptoPwhashAlgArgon2id13 == Sodium.cryptoPwhashAlgDefault,
|
||||
"mismatch in expected default pw hashing algo",
|
||||
);
|
||||
int memLimit = Sodium.cryptoPwhashMemlimitInteractive;
|
||||
int opsLimit = Sodium.cryptoPwhashOpslimitInteractive;
|
||||
final int memLimit = Sodium.cryptoPwhashMemlimitInteractive;
|
||||
final int opsLimit = Sodium.cryptoPwhashOpslimitInteractive;
|
||||
final kekSalt = CryptoUtil.getSaltToDeriveKey();
|
||||
final result = await CryptoUtil.deriveKey(
|
||||
utf8.encode(pass),
|
||||
|
@ -444,7 +444,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
}
|
||||
|
||||
Text _getLinkExpiryTimeWidget() {
|
||||
int validTill = widget.collection.publicURLs?.first?.validTill ?? 0;
|
||||
final int validTill = widget.collection.publicURLs?.first?.validTill ?? 0;
|
||||
if (validTill == 0) {
|
||||
return const Text(
|
||||
'Never',
|
||||
|
@ -470,7 +470,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
|||
}
|
||||
|
||||
Future<void> _showDeviceLimitPicker() async {
|
||||
List<Text> options = [];
|
||||
final List<Text> options = [];
|
||||
for (int i = 50; i > 0; i--) {
|
||||
options.add(
|
||||
Text(i.toString(), style: Theme.of(context).textTheme.subtitle1),
|
||||
|
|
|
@ -91,7 +91,7 @@ class _SharingDialogState extends State<SharingDialog> {
|
|||
}
|
||||
|
||||
if (!FeatureFlagService.instance.disableUrlSharing()) {
|
||||
bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
|
||||
final bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
|
||||
children.addAll([
|
||||
const Padding(padding: EdgeInsets.all(16)),
|
||||
const Divider(height: 1),
|
||||
|
@ -246,10 +246,10 @@ class _SharingDialogState extends State<SharingDialog> {
|
|||
}
|
||||
|
||||
Widget _getShareableUrlWidget(BuildContext parentContext) {
|
||||
String collectionKey = Base58Encode(
|
||||
final String collectionKey = Base58Encode(
|
||||
CollectionsService.instance.getCollectionKey(widget.collection.id),
|
||||
);
|
||||
String url = "${widget.collection.publicURLs.first.url}#$collectionKey";
|
||||
final String url = "${widget.collection.publicURLs.first.url}#$collectionKey";
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
@ -436,7 +436,7 @@ class _SharingDialogState extends State<SharingDialog> {
|
|||
}
|
||||
|
||||
void _showUnSupportedAlert() {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Sorry"),
|
||||
content: const Text(
|
||||
"Sharing is not permitted for free accounts, please subscribe",
|
||||
|
|
|
@ -135,7 +135,7 @@ class _SyncStatusWidgetState extends State<SyncStatusWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool isNotOutdatedEvent = _event != null &&
|
||||
final bool isNotOutdatedEvent = _event != null &&
|
||||
(_event.status == SyncStatus.completedBackup ||
|
||||
_event.status == SyncStatus.completedFirstGalleryImport) &&
|
||||
(DateTime.now().microsecondsSinceEpoch - _event.timestamp >
|
||||
|
|
|
@ -70,11 +70,11 @@ class ColorFilterGenerator {
|
|||
0,
|
||||
];
|
||||
}
|
||||
double cosVal = cos(value);
|
||||
double sinVal = sin(value);
|
||||
double lumR = 0.213;
|
||||
double lumG = 0.715;
|
||||
double lumB = 0.072;
|
||||
final double cosVal = cos(value);
|
||||
final double sinVal = sin(value);
|
||||
const double lumR = 0.213;
|
||||
const double lumG = 0.715;
|
||||
const double lumB = 0.072;
|
||||
|
||||
return List<double>.from(<double>[
|
||||
(lumR + (cosVal * (1 - lumR))) + (sinVal * (-lumR)),
|
||||
|
|
|
@ -157,7 +157,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildFlipButton() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
|
@ -191,7 +191,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildRotateLeftButton() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
|
@ -221,7 +221,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildRotateRightButton() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
|
@ -251,7 +251,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildSaveButton() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
|
@ -349,7 +349,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
newFile.collectionID = widget.originalFile.collectionID;
|
||||
newFile.location = widget.originalFile.location;
|
||||
if (!newFile.hasLocation() && widget.originalFile.localID != null) {
|
||||
var assetEntity = await widget.originalFile.getAsset();
|
||||
final assetEntity = await widget.originalFile.getAsset();
|
||||
if (assetEntity != null) {
|
||||
final latLong = await assetEntity.latlngAsync();
|
||||
newFile.location = Location(latLong.latitude, latLong.longitude);
|
||||
|
@ -394,7 +394,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildSat() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
|
||||
|
@ -440,7 +440,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Widget _buildBrightness() {
|
||||
TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
|
||||
|
@ -486,7 +486,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
|||
}
|
||||
|
||||
Future<void> _showExitConfirmationDialog() async {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
title: const Text("Discard edits?"),
|
||||
actions: [
|
||||
TextButton(
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
class CustomAppBar extends PreferredSize {
|
||||
@override
|
||||
final Widget child;
|
||||
final double height;
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ class _DetailPageState extends State<DetailPage> {
|
|||
return PageView.builder(
|
||||
itemBuilder: (context, index) {
|
||||
final file = _files[index];
|
||||
Widget content = FileWidget(
|
||||
final Widget content = FileWidget(
|
||||
file,
|
||||
autoPlay: !_hasPageChanged,
|
||||
tagPrefix: widget.config.tagPrefix,
|
||||
|
|
|
@ -300,9 +300,9 @@ class FadingAppBarState extends State<FadingAppBar> {
|
|||
Future<void> _download(File file) async {
|
||||
final dialog = createProgressDialog(context, "Downloading...");
|
||||
await dialog.show();
|
||||
FileType type = file.fileType;
|
||||
final FileType type = file.fileType;
|
||||
// save and track image for livePhoto/image and video for FileType.video
|
||||
io.File fileToSave = await getFile(file);
|
||||
final io.File fileToSave = await getFile(file);
|
||||
final savedAsset = type == FileType.video
|
||||
? (await PhotoManager.editor.saveVideo(fileToSave, title: file.title))
|
||||
: (await PhotoManager.editor
|
||||
|
@ -313,7 +313,7 @@ class FadingAppBarState extends State<FadingAppBar> {
|
|||
await FilesDB.instance.insert(file);
|
||||
|
||||
if (type == FileType.livePhoto) {
|
||||
io.File liveVideo = await getFileFromServer(file, liveVideo: true);
|
||||
final io.File liveVideo = await getFileFromServer(file, liveVideo: true);
|
||||
if (liveVideo == null) {
|
||||
_logger.warning("Failed to find live video" + file.tag());
|
||||
} else {
|
||||
|
|
|
@ -59,7 +59,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
|
|||
}
|
||||
|
||||
Widget _getBottomBar() {
|
||||
List<Widget> children = [];
|
||||
final List<Widget> children = [];
|
||||
children.add(
|
||||
Tooltip(
|
||||
message: "Info",
|
||||
|
@ -103,7 +103,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
|
|||
}
|
||||
if (widget.file.uploadedFileID != null &&
|
||||
widget.file.ownerID == Configuration.instance.getUserID()) {
|
||||
bool isArchived =
|
||||
final bool isArchived =
|
||||
widget.file.magicMetadata.visibility == kVisibilityArchive;
|
||||
children.add(
|
||||
Tooltip(
|
||||
|
@ -151,7 +151,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
|
|||
),
|
||||
);
|
||||
}
|
||||
var safeAreaBottomPadding = MediaQuery.of(context).padding.bottom * .5;
|
||||
final safeAreaBottomPadding = MediaQuery.of(context).padding.bottom * .5;
|
||||
return IgnorePointer(
|
||||
ignoring: _shouldHide,
|
||||
child: AnimatedOpacity(
|
||||
|
|
|
@ -76,7 +76,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
|
|||
_exifData["ISO"] != null;
|
||||
final bool showDimension =
|
||||
_exifData["resolution"] != null && _exifData["megaPixels"] != null;
|
||||
var listTiles = <Widget>[
|
||||
final listTiles = <Widget>[
|
||||
ListTile(
|
||||
leading: const Padding(
|
||||
padding: EdgeInsets.only(top: 8, left: 6),
|
||||
|
@ -207,7 +207,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
|
|||
onTap: () {
|
||||
if (file.collectionID != null) {
|
||||
Navigator.pop(context); // info dialog
|
||||
Collection c = CollectionsService.instance
|
||||
final Collection c = CollectionsService.instance
|
||||
.getCollectionByID(file.collectionID);
|
||||
routeToPage(
|
||||
context,
|
||||
|
|
|
@ -91,7 +91,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
|
|||
// If yes, parent thumbnail widget can be stateless
|
||||
Widget content;
|
||||
if (image != null) {
|
||||
List<Widget> contentChildren = [image];
|
||||
final List<Widget> contentChildren = [image];
|
||||
if (widget.file.fileType == FileType.video) {
|
||||
contentChildren.add(const VideoOverlayIcon());
|
||||
} else if (widget.file.fileType == FileType.livePhoto &&
|
||||
|
@ -105,7 +105,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
|
|||
children: contentChildren,
|
||||
);
|
||||
}
|
||||
List<Widget> viewChildren = [
|
||||
final List<Widget> viewChildren = [
|
||||
const ThumbnailPlaceHolder(),
|
||||
AnimatedOpacity(
|
||||
opacity: content == null ? 0 : 1.0,
|
||||
|
|
|
@ -242,7 +242,7 @@ class _VideoControlsState extends State<VideoControls> {
|
|||
}
|
||||
|
||||
void _playPause() {
|
||||
bool isFinished = _latestValue.position >= _latestValue.duration;
|
||||
final bool isFinished = _latestValue.position >= _latestValue.duration;
|
||||
|
||||
setState(() {
|
||||
if (controller.value.isPlaying) {
|
||||
|
|
|
@ -88,7 +88,7 @@ class _ZoomableImageState extends State<ZoomableImage>
|
|||
content = const EnteLoadingWidget();
|
||||
}
|
||||
|
||||
GestureDragUpdateCallback verticalDragCallback = _isZooming
|
||||
final GestureDragUpdateCallback verticalDragCallback = _isZooming
|
||||
? null
|
||||
: (d) => {
|
||||
if (!_isZooming && d.delta.dy > kDragSensitivity)
|
||||
|
|
|
@ -152,7 +152,7 @@ class _ZoomableLiveImageState extends State<ZoomableLiveImage>
|
|||
}
|
||||
|
||||
VideoPlayerController _setVideoPlayerController({io.File file}) {
|
||||
var videoPlayerController = VideoPlayerController.file(file);
|
||||
final videoPlayerController = VideoPlayerController.file(file);
|
||||
return _videoPlayerController = videoPlayerController
|
||||
..initialize().whenComplete(() {
|
||||
if (mounted) {
|
||||
|
@ -164,8 +164,8 @@ class _ZoomableLiveImageState extends State<ZoomableLiveImage>
|
|||
}
|
||||
|
||||
void _showLivePhotoToast() async {
|
||||
var preferences = await SharedPreferences.getInstance();
|
||||
int promptTillNow = preferences.getInt(kLivePhotoToastCounterKey) ?? 0;
|
||||
final preferences = await SharedPreferences.getInstance();
|
||||
final int promptTillNow = preferences.getInt(kLivePhotoToastCounterKey) ?? 0;
|
||||
if (promptTillNow < kMaxLivePhotoToastCount && mounted) {
|
||||
showToast(context, "Press and hold to play video");
|
||||
preferences.setInt(kLivePhotoToastCounterKey, promptTillNow + 1);
|
||||
|
|
|
@ -183,7 +183,7 @@ class _GalleryState extends State<Gallery> {
|
|||
return const EnteLoadingWidget();
|
||||
},
|
||||
emptyResultBuilder: (_) {
|
||||
List<Widget> children = [];
|
||||
final List<Widget> children = [];
|
||||
if (widget.header != null) {
|
||||
children.add(widget.header);
|
||||
}
|
||||
|
@ -269,8 +269,8 @@ class _GalleryState extends State<Gallery> {
|
|||
}
|
||||
|
||||
bool _areFromSameDay(int firstCreationTime, int secondCreationTime) {
|
||||
var firstDate = DateTime.fromMicrosecondsSinceEpoch(firstCreationTime);
|
||||
var secondDate = DateTime.fromMicrosecondsSinceEpoch(secondCreationTime);
|
||||
final firstDate = DateTime.fromMicrosecondsSinceEpoch(firstCreationTime);
|
||||
final secondDate = DateTime.fromMicrosecondsSinceEpoch(secondCreationTime);
|
||||
return firstDate.year == secondDate.year &&
|
||||
firstDate.month == secondDate.month &&
|
||||
firstDate.day == secondDate.day;
|
||||
|
|
|
@ -118,7 +118,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
|
|||
}
|
||||
|
||||
List<Widget> _getDefaultActions(BuildContext context) {
|
||||
List<Widget> actions = <Widget>[];
|
||||
final List<Widget> actions = <Widget>[];
|
||||
if (Configuration.instance.hasConfiguredAccount() &&
|
||||
widget.selectedFiles.files.isEmpty &&
|
||||
(widget.type == GalleryType.localFolder ||
|
||||
|
@ -156,7 +156,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
|
|||
),
|
||||
);
|
||||
}
|
||||
bool isArchived = widget.collection.isArchived();
|
||||
final bool isArchived = widget.collection.isArchived();
|
||||
items.add(
|
||||
PopupMenuItem(
|
||||
value: 2,
|
||||
|
|
|
@ -66,7 +66,7 @@ class _GalleryOverlayWidgetState extends State<GalleryOverlayWidget> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
|
||||
final bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
|
||||
final bottomPadding = Platform.isAndroid ? 0.0 : 12.0;
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(bottom: bottomPadding),
|
||||
|
@ -254,7 +254,7 @@ class _OverlayWidgetState extends State<OverlayWidget> {
|
|||
}
|
||||
|
||||
List<Widget> _getActions(BuildContext context) {
|
||||
List<Widget> actions = <Widget>[];
|
||||
final List<Widget> actions = <Widget>[];
|
||||
if (widget.type == GalleryType.trash) {
|
||||
_addTrashAction(actions);
|
||||
return actions;
|
||||
|
@ -372,7 +372,7 @@ class _OverlayWidgetState extends State<OverlayWidget> {
|
|||
|
||||
if (widget.type == GalleryType.homepage ||
|
||||
widget.type == GalleryType.archive) {
|
||||
bool showArchive = widget.type == GalleryType.homepage;
|
||||
final bool showArchive = widget.type == GalleryType.homepage;
|
||||
actions.add(
|
||||
Tooltip(
|
||||
message: showArchive ? "Hide" : "Unhide",
|
||||
|
|
|
@ -48,7 +48,7 @@ class _TrashPageState extends State<TrashPage> {
|
|||
|
||||
@override
|
||||
Widget build(Object context) {
|
||||
bool filesAreSelected = widget._selectedFiles.files.isNotEmpty;
|
||||
final bool filesAreSelected = widget._selectedFiles.files.isNotEmpty;
|
||||
|
||||
final gallery = Gallery(
|
||||
asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) {
|
||||
|
|
|
@ -20,7 +20,7 @@ String convertBytesToReadableFormat(int bytes) {
|
|||
String formatBytes(int bytes, [int decimals = 2]) {
|
||||
if (bytes == 0) return '0 bytes';
|
||||
const k = 1024;
|
||||
int dm = decimals < 0 ? 0 : decimals;
|
||||
int i = (log(bytes) / log(k)).floor();
|
||||
final int dm = decimals < 0 ? 0 : decimals;
|
||||
final int i = (log(bytes) / log(k)).floor();
|
||||
return ((bytes / pow(k, i)).toStringAsFixed(dm)) + ' ' + kStorageUnits[i];
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ String getFullDate(DateTime dateTime) {
|
|||
}
|
||||
|
||||
String daysLeft(int futureTime) {
|
||||
int daysLeft = ((futureTime - DateTime.now().microsecondsSinceEpoch) /
|
||||
final int daysLeft = ((futureTime - DateTime.now().microsecondsSinceEpoch) /
|
||||
Duration.microsecondsPerDay)
|
||||
.ceil();
|
||||
return '$daysLeft day' + (daysLeft <= 1 ? "" : "s");
|
||||
|
@ -143,7 +143,7 @@ String formatDuration(Duration position) {
|
|||
int seconds = ms ~/ 1000;
|
||||
final int hours = seconds ~/ 3600;
|
||||
seconds = seconds % 3600;
|
||||
var minutes = seconds ~/ 60;
|
||||
final minutes = seconds ~/ 60;
|
||||
seconds = seconds % 60;
|
||||
|
||||
final hoursString = hours >= 10
|
||||
|
@ -230,15 +230,15 @@ String secondsToHHMMSS(int value) {
|
|||
h = value ~/ 3600;
|
||||
m = ((value - h * 3600)) ~/ 60;
|
||||
s = value - (h * 3600) - (m * 60);
|
||||
String hourLeft = h.toString().length < 2 ? "0" + h.toString() : h.toString();
|
||||
final String hourLeft = h.toString().length < 2 ? "0" + h.toString() : h.toString();
|
||||
|
||||
String minuteLeft =
|
||||
final String minuteLeft =
|
||||
m.toString().length < 2 ? "0" + m.toString() : m.toString();
|
||||
|
||||
String secondsLeft =
|
||||
final String secondsLeft =
|
||||
s.toString().length < 2 ? "0" + s.toString() : s.toString();
|
||||
|
||||
String result = "$hourLeft:$minuteLeft:$secondsLeft";
|
||||
final String result = "$hourLeft:$minuteLeft:$secondsLeft";
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -418,7 +418,7 @@ Future<List<String>> _deleteLocalFilesInBatches(
|
|||
|
||||
Future<bool> _localFileExist(File file) {
|
||||
if (file.isSharedMediaToAppSandbox()) {
|
||||
var localFile = io.File(getSharedMediaFilePath(file));
|
||||
final localFile = io.File(getSharedMediaFilePath(file));
|
||||
return localFile.exists();
|
||||
} else {
|
||||
return file.getAsset().then((asset) {
|
||||
|
@ -434,7 +434,7 @@ Future<List<String>> _tryDeleteSharedMediaFiles(List<String> localIDs) {
|
|||
final List<String> actuallyDeletedIDs = [];
|
||||
try {
|
||||
return Future.forEach(localIDs, (id) async {
|
||||
String localPath = getSharedMediaPathFromLocalID(id);
|
||||
final String localPath = getSharedMediaPathFromLocalID(id);
|
||||
try {
|
||||
// verify the file exists as the OS may have already deleted it from cache
|
||||
if (io.File(localPath).existsSync()) {
|
||||
|
|
|
@ -29,7 +29,7 @@ Future<dynamic> showErrorDialog(
|
|||
String title,
|
||||
String content,
|
||||
) {
|
||||
AlertDialog alert = AlertDialog(
|
||||
final AlertDialog alert = AlertDialog(
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
title: Text(
|
||||
title,
|
||||
|
@ -77,7 +77,7 @@ Future<T> showConfettiDialog<T>({
|
|||
final pageBuilder = Builder(
|
||||
builder: builder,
|
||||
);
|
||||
ConfettiController confettiController =
|
||||
final ConfettiController confettiController =
|
||||
ConfettiController(duration: const Duration(seconds: 1));
|
||||
confettiController.play();
|
||||
return showDialog(
|
||||
|
|
|
@ -76,7 +76,7 @@ class DiffFetcher {
|
|||
fileDecryptionKey,
|
||||
Sodium.base642bin(file.metadataDecryptionHeader),
|
||||
);
|
||||
Map<String, dynamic> metadata =
|
||||
final Map<String, dynamic> metadata =
|
||||
jsonDecode(utf8.decode(encodedMetadata));
|
||||
file.applyMetadata(metadata);
|
||||
if (item['magicMetadata'] != null) {
|
||||
|
|
|
@ -126,7 +126,7 @@ Future<void> _sendLogs(
|
|||
String subject,
|
||||
String body,
|
||||
) async {
|
||||
String zipFilePath = await getZippedLogsFile(context);
|
||||
final String zipFilePath = await getZippedLogsFile(context);
|
||||
final Email email = Email(
|
||||
recipients: [toEmail],
|
||||
subject: subject,
|
||||
|
@ -150,7 +150,7 @@ Future<String> getZippedLogsFile(BuildContext context) async {
|
|||
final tempPath = (await getTemporaryDirectory()).path;
|
||||
final zipFilePath =
|
||||
tempPath + "/logs-${Configuration.instance.getUserID() ?? 0}.zip";
|
||||
var encoder = ZipFileEncoder();
|
||||
final encoder = ZipFileEncoder();
|
||||
encoder.create(zipFilePath);
|
||||
encoder.addDirectory(logsDirectory);
|
||||
encoder.close();
|
||||
|
@ -187,8 +187,8 @@ Future<void> sendEmail(
|
|||
String body,
|
||||
}) async {
|
||||
try {
|
||||
String clientDebugInfo = await _clientInfo();
|
||||
EmailContent email = EmailContent(
|
||||
final String clientDebugInfo = await _clientInfo();
|
||||
final EmailContent email = EmailContent(
|
||||
to: [
|
||||
to,
|
||||
],
|
||||
|
@ -210,7 +210,7 @@ Future<void> sendEmail(
|
|||
throw Exception('Could not launch ${params.toString()}');
|
||||
}
|
||||
} else {
|
||||
OpenMailAppResult result = await OpenMailApp.composeNewEmailInMailApp(
|
||||
final OpenMailAppResult result = await OpenMailApp.composeNewEmailInMailApp(
|
||||
nativePickerTitle: 'Select email app',
|
||||
emailContent: email,
|
||||
);
|
||||
|
@ -257,7 +257,7 @@ Future<void> sendEmail(
|
|||
|
||||
Future<String> _clientInfo() async {
|
||||
final packageInfo = await PackageInfo.fromPlatform();
|
||||
String debugInfo = '\n\n\n\n ------------------- \nFollowing information can '
|
||||
final String debugInfo = '\n\n\n\n ------------------- \nFollowing information can '
|
||||
'help us in debugging if you are facing any issue '
|
||||
'\nRegistered email: ${Configuration.instance.getEmail()}'
|
||||
'\nClient: ${packageInfo.packageName}'
|
||||
|
|
|
@ -167,7 +167,7 @@ Future<List<File>> _computeFiles(
|
|||
}
|
||||
|
||||
Future<List<AssetEntity>> _getAllAssetLists(AssetPathEntity pathEntity) async {
|
||||
List<AssetEntity> result = [];
|
||||
final List<AssetEntity> result = [];
|
||||
int currentPage = 0;
|
||||
List<AssetEntity> currentPageResult = [];
|
||||
do {
|
||||
|
|
|
@ -209,7 +209,7 @@ class FileUploader {
|
|||
}
|
||||
|
||||
void removeFromQueueWhere(final bool Function(File) fn, final Error reason) {
|
||||
List<String> uploadsToBeRemoved = [];
|
||||
final List<String> uploadsToBeRemoved = [];
|
||||
_queue.entries
|
||||
.where((entry) => entry.value.status == UploadStatus.notStarted)
|
||||
.forEach((pendingUpload) {
|
||||
|
@ -308,7 +308,7 @@ class FileUploader {
|
|||
bool forcedUpload,
|
||||
) async {
|
||||
final connectivityResult = await (Connectivity().checkConnectivity());
|
||||
var canUploadUnderCurrentNetworkConditions =
|
||||
final canUploadUnderCurrentNetworkConditions =
|
||||
(connectivityResult == ConnectivityResult.wifi ||
|
||||
Configuration.instance.shouldBackupOverMobileData());
|
||||
if (!canUploadUnderCurrentNetworkConditions && !forcedUpload) {
|
||||
|
@ -363,7 +363,7 @@ class FileUploader {
|
|||
}
|
||||
}
|
||||
Uint8List key;
|
||||
bool isUpdatedFile =
|
||||
final bool isUpdatedFile =
|
||||
file.uploadedFileID != null && file.updationTime == -1;
|
||||
if (isUpdatedFile) {
|
||||
_logger.info("File was updated " + file.toString());
|
||||
|
@ -381,7 +381,7 @@ class FileUploader {
|
|||
encryptedFilePath,
|
||||
key: key,
|
||||
);
|
||||
var thumbnailData = mediaUploadData.thumbnail;
|
||||
final thumbnailData = mediaUploadData.thumbnail;
|
||||
|
||||
final encryptedThumbnailData =
|
||||
await CryptoUtil.encryptChaCha(thumbnailData, fileAttributes.key);
|
||||
|
@ -393,11 +393,11 @@ class FileUploader {
|
|||
.writeAsBytes(encryptedThumbnailData.encryptedData);
|
||||
|
||||
final thumbnailUploadURL = await _getUploadURL();
|
||||
String thumbnailObjectKey =
|
||||
final String thumbnailObjectKey =
|
||||
await _putFile(thumbnailUploadURL, encryptedThumbnailFile);
|
||||
|
||||
final fileUploadURL = await _getUploadURL();
|
||||
String fileObjectKey = await _putFile(fileUploadURL, encryptedFile);
|
||||
final String fileObjectKey = await _putFile(fileUploadURL, encryptedFile);
|
||||
|
||||
final metadata =
|
||||
await file.getMetadataForUpload(mediaUploadData.sourceFile);
|
||||
|
@ -496,7 +496,7 @@ class FileUploader {
|
|||
}
|
||||
|
||||
Future _onInvalidFileError(File file, InvalidFileError e) async {
|
||||
String ext = file.title == null ? "no title" : extension(file.title);
|
||||
final String ext = file.title == null ? "no title" : extension(file.title);
|
||||
_logger.severe(
|
||||
"Invalid file: (ext: $ext) encountered: " + file.toString(),
|
||||
e,
|
||||
|
|
|
@ -76,7 +76,7 @@ Future<MediaUploadData> _getMediaUploadDataFromAssetFile(ente.File file) async {
|
|||
if (file.fileType == FileType.livePhoto && io.Platform.isIOS) {
|
||||
final io.File videoUrl = await Motionphoto.getLivePhotoFile(file.localID);
|
||||
if (videoUrl == null || !videoUrl.existsSync()) {
|
||||
String errMsg =
|
||||
final String errMsg =
|
||||
"missing livePhoto url for ${file.toString()} with subType ${file.fileSubType}";
|
||||
_logger.severe(errMsg);
|
||||
throw InvalidFileUploadState(errMsg);
|
||||
|
@ -85,7 +85,7 @@ Future<MediaUploadData> _getMediaUploadDataFromAssetFile(ente.File file) async {
|
|||
// .elp -> ente live photo
|
||||
final livePhotoPath = tempPath + file.generatedID.toString() + ".elp";
|
||||
_logger.fine("Uploading zipped live photo from " + livePhotoPath);
|
||||
var encoder = ZipFileEncoder();
|
||||
final encoder = ZipFileEncoder();
|
||||
encoder.create(livePhotoPath);
|
||||
encoder.addFile(videoUrl, "video" + extension(videoUrl.path));
|
||||
encoder.addFile(sourceFile, "image" + extension(sourceFile.path));
|
||||
|
@ -136,8 +136,8 @@ Future<void> _decorateEnteFileData(ente.File file, AssetEntity asset) async {
|
|||
Future<MediaUploadData> _getMediaUploadDataFromAppCache(ente.File file) async {
|
||||
io.File sourceFile;
|
||||
Uint8List thumbnailData;
|
||||
bool isDeleted = false;
|
||||
var localPath = getSharedMediaFilePath(file);
|
||||
const bool isDeleted = false;
|
||||
final localPath = getSharedMediaFilePath(file);
|
||||
sourceFile = io.File(localPath);
|
||||
if (!sourceFile.existsSync()) {
|
||||
_logger.warning("File doesn't exist in app sandbox");
|
||||
|
|
|
@ -40,7 +40,7 @@ Future<io.File> getFile(
|
|||
if (file.isRemoteFile()) {
|
||||
return getFileFromServer(file, liveVideo: liveVideo);
|
||||
} else {
|
||||
String key = file.tag() + liveVideo.toString() + isOrigin.toString();
|
||||
final String key = file.tag() + liveVideo.toString() + isOrigin.toString();
|
||||
final cachedFile = FileLruCache.get(key);
|
||||
if (cachedFile == null) {
|
||||
final diskFile = await _getLocalDiskFile(
|
||||
|
@ -69,7 +69,7 @@ Future<io.File> _getLocalDiskFile(
|
|||
bool isOrigin = false,
|
||||
}) async {
|
||||
if (file.isSharedMediaToAppSandbox()) {
|
||||
var localFile = io.File(getSharedMediaFilePath(file));
|
||||
final localFile = io.File(getSharedMediaFilePath(file));
|
||||
return localFile.exists().then((exist) {
|
||||
return exist ? localFile : null;
|
||||
});
|
||||
|
@ -194,17 +194,17 @@ Future<_LivePhoto> _downloadLivePhoto(
|
|||
}
|
||||
_logger.fine("Decoded zipped live photo from " + decryptedFile.path);
|
||||
io.File imageFileCache, videoFileCache;
|
||||
List<int> bytes = await decryptedFile.readAsBytes();
|
||||
Archive archive = ZipDecoder().decodeBytes(bytes);
|
||||
final List<int> bytes = await decryptedFile.readAsBytes();
|
||||
final Archive archive = ZipDecoder().decodeBytes(bytes);
|
||||
final tempPath = Configuration.instance.getTempDirectory();
|
||||
// Extract the contents of Zip compressed archive to disk
|
||||
for (ArchiveFile archiveFile in archive) {
|
||||
if (archiveFile.isFile) {
|
||||
String filename = archiveFile.name;
|
||||
String fileExtension = getExtension(archiveFile.name);
|
||||
String decodePath =
|
||||
final String filename = archiveFile.name;
|
||||
final String fileExtension = getExtension(archiveFile.name);
|
||||
final String decodePath =
|
||||
tempPath + file.uploadedFileID.toString() + filename;
|
||||
List<int> data = archiveFile.content;
|
||||
final List<int> data = archiveFile.content;
|
||||
if (filename.startsWith("image")) {
|
||||
final imageFile = io.File(decodePath);
|
||||
await imageFile.create(recursive: true);
|
||||
|
@ -259,8 +259,8 @@ Future<io.File> _downloadAndCache(
|
|||
if (decryptedFile == null) {
|
||||
return null;
|
||||
}
|
||||
var decryptedFilePath = decryptedFile.path;
|
||||
String fileExtension = getExtension(file.title);
|
||||
final decryptedFilePath = decryptedFile.path;
|
||||
final String fileExtension = getExtension(file.title);
|
||||
var outputFile = decryptedFile;
|
||||
if ((fileExtension == "unknown" && file.fileType == FileType.image) ||
|
||||
(io.Platform.isAndroid && fileExtension == "heic")) {
|
||||
|
|
|
@ -27,7 +27,7 @@ class HexEncoder extends Converter<List<int>, String> {
|
|||
|
||||
@override
|
||||
String convert(List<int> bytes) {
|
||||
StringBuffer buffer = StringBuffer();
|
||||
final StringBuffer buffer = StringBuffer();
|
||||
for (int part in bytes) {
|
||||
if (part & 0xff != part) {
|
||||
throw const FormatException("Non-byte integer detected");
|
||||
|
@ -53,10 +53,10 @@ class HexDecoder extends Converter<String, List<int>> {
|
|||
if (str.length % 2 != 0) {
|
||||
str = "0" + str;
|
||||
}
|
||||
Uint8List result = Uint8List(str.length ~/ 2);
|
||||
final Uint8List result = Uint8List(str.length ~/ 2);
|
||||
for (int i = 0; i < result.length; i++) {
|
||||
int firstDigit = _alphabet.indexOf(str[i * 2]);
|
||||
int secondDigit = _alphabet.indexOf(str[i * 2 + 1]);
|
||||
final int firstDigit = _alphabet.indexOf(str[i * 2]);
|
||||
final int secondDigit = _alphabet.indexOf(str[i * 2 + 1]);
|
||||
if (firstDigit == -1 || secondDigit == -1) {
|
||||
throw FormatException("Non-hex character detected in $hex");
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ Future<void> changeCollectionVisibility(
|
|||
);
|
||||
await dialog.show();
|
||||
try {
|
||||
Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
|
||||
final Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
|
||||
await CollectionsService.instance.updateMagicMetadata(collection, update);
|
||||
// Force reload home gallery to pull in the now unarchived files
|
||||
Bus.instance.fire(ForceReloadHomeGalleryEvent());
|
||||
|
@ -135,7 +135,7 @@ Future<void> _updatePublicMetadata(
|
|||
final dialog = createProgressDialog(context, 'please wait...');
|
||||
await dialog.show();
|
||||
try {
|
||||
Map<String, dynamic> update = {key: value};
|
||||
final Map<String, dynamic> update = {key: value};
|
||||
await FileMagicService.instance.updatePublicMagicMetadata(files, update);
|
||||
showShortToast(context, 'done');
|
||||
await dialog.hide();
|
||||
|
|
|
@ -44,12 +44,12 @@ Future<void> share(
|
|||
|
||||
Rect shareButtonRect(BuildContext context, GlobalKey shareButtonKey) {
|
||||
Size size = MediaQuery.of(context).size;
|
||||
RenderBox renderBox = shareButtonKey?.currentContext?.findRenderObject();
|
||||
final RenderBox renderBox = shareButtonKey?.currentContext?.findRenderObject();
|
||||
if (renderBox == null) {
|
||||
return Rect.fromLTWH(0, 0, size.width, size.height / 2);
|
||||
}
|
||||
size = renderBox.size;
|
||||
Offset position = renderBox.localToGlobal(Offset.zero);
|
||||
final Offset position = renderBox.localToGlobal(Offset.zero);
|
||||
return Rect.fromCenter(
|
||||
center: position + Offset(size.width / 2, size.height / 2),
|
||||
width: size.width,
|
||||
|
@ -65,7 +65,7 @@ Future<List<File>> convertIncomingSharedMediaToFile(
|
|||
List<SharedMediaFile> sharedMedia,
|
||||
int collectionID,
|
||||
) async {
|
||||
List<File> localFiles = [];
|
||||
final List<File> localFiles = [];
|
||||
for (var media in sharedMedia) {
|
||||
if (!(media.type == SharedMediaType.IMAGE ||
|
||||
media.type == SharedMediaType.VIDEO)) {
|
||||
|
@ -74,7 +74,7 @@ Future<List<File>> convertIncomingSharedMediaToFile(
|
|||
);
|
||||
continue;
|
||||
}
|
||||
var enteFile = File();
|
||||
final enteFile = File();
|
||||
// fileName: img_x.jpg
|
||||
enteFile.title = basename(media.path);
|
||||
var ioFile = dartio.File(media.path);
|
||||
|
|
|
@ -62,7 +62,7 @@ class TrashDiffFetcher {
|
|||
fileDecryptionKey,
|
||||
Sodium.base642bin(trash.metadataDecryptionHeader),
|
||||
);
|
||||
Map<String, dynamic> metadata =
|
||||
final Map<String, dynamic> metadata =
|
||||
jsonDecode(utf8.decode(encodedMetadata));
|
||||
trash.applyMetadata(metadata);
|
||||
if (item["file"]['magicMetadata'] != null) {
|
||||
|
|
|
@ -30,7 +30,7 @@ void validatePreVerificationStateCheck(
|
|||
}
|
||||
// check password encoding issues
|
||||
try {
|
||||
Uint8List passwordL = utf8.encode(password);
|
||||
final Uint8List passwordL = utf8.encode(password);
|
||||
try {
|
||||
utf8.decode(passwordL);
|
||||
} catch (e) {
|
||||
|
|
Loading…
Add table
Reference in a new issue