Apply lint suggestions
This commit is contained in:
parent
3234081e85
commit
f3d8a13337
38 changed files with 259 additions and 358 deletions
|
@ -16,7 +16,7 @@
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */ = {isa = PBXBuildFile; };
|
DA6BE5E826B3BC8600656280 /* (null) in Resources */ = {isa = PBXBuildFile; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
@ -213,7 +213,7 @@
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||||
DA6BE5E826B3BC8600656280 /* BuildFile in Resources */,
|
DA6BE5E826B3BC8600656280 /* (null) in Resources */,
|
||||||
277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
|
277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -501,10 +501,7 @@
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
|
@ -661,10 +658,7 @@
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
|
@ -698,10 +692,7 @@
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
LIBRARY_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Flutter",
|
"$(PROJECT_DIR)/Flutter",
|
||||||
|
|
|
@ -239,7 +239,7 @@ class SuperLogging {
|
||||||
extraLines = null;
|
extraLines = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final str = (config.prefix ?? '') + " " + rec.toPrettyString(extraLines);
|
final str = (config.prefix) + " " + rec.toPrettyString(extraLines);
|
||||||
|
|
||||||
// write to stdout
|
// write to stdout
|
||||||
printLog(str);
|
printLog(str);
|
||||||
|
|
|
@ -109,7 +109,7 @@ class TrashDB {
|
||||||
orderBy: '$columnTrashDeleteBy DESC',
|
orderBy: '$columnTrashDeleteBy DESC',
|
||||||
limit: 1,
|
limit: 1,
|
||||||
);
|
);
|
||||||
if (rows == null || rows.isEmpty) {
|
if (rows.isEmpty) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return _getTrashFromRow(rows[0]);
|
return _getTrashFromRow(rows[0]);
|
||||||
|
@ -264,10 +264,10 @@ class TrashDB {
|
||||||
row[columnCreationTime] = trash.creationTime;
|
row[columnCreationTime] = trash.creationTime;
|
||||||
row[columnFileMetadata] = jsonEncode(trash.metadata);
|
row[columnFileMetadata] = jsonEncode(trash.metadata);
|
||||||
|
|
||||||
row[columnMMdVersion] = trash.mMdVersion ?? 0;
|
row[columnMMdVersion] = trash.mMdVersion;
|
||||||
row[columnMMdEncodedJson] = trash.mMdEncodedJson ?? '{}';
|
row[columnMMdEncodedJson] = trash.mMdEncodedJson ?? '{}';
|
||||||
|
|
||||||
row[columnPubMMdVersion] = trash.pubMmdVersion ?? 0;
|
row[columnPubMMdVersion] = trash.pubMmdVersion;
|
||||||
row[columnPubMMdEncodedJson] = trash.pubMmdEncodedJson ?? '{}';
|
row[columnPubMMdEncodedJson] = trash.pubMmdEncodedJson ?? '{}';
|
||||||
return row;
|
return row;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,9 +53,7 @@ class BillingService {
|
||||||
purchase.productID,
|
purchase.productID,
|
||||||
purchase.verificationData.serverVerificationData,
|
purchase.verificationData.serverVerificationData,
|
||||||
).then((response) {
|
).then((response) {
|
||||||
if (response != null) {
|
InAppPurchase.instance.completePurchase(purchase);
|
||||||
InAppPurchase.instance.completePurchase(purchase);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else if (Platform.isIOS && purchase.pendingCompletePurchase) {
|
} else if (Platform.isIOS && purchase.pendingCompletePurchase) {
|
||||||
InAppPurchase.instance.completePurchase(purchase);
|
InAppPurchase.instance.completePurchase(purchase);
|
||||||
|
|
|
@ -454,9 +454,7 @@ class CollectionsService {
|
||||||
_config.getSecretKey()!,
|
_config.getSecretKey()!,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (collectionKey != null) {
|
_cachedKeys[collection.id] = collectionKey;
|
||||||
_cachedKeys[collection.id] = collectionKey;
|
|
||||||
}
|
|
||||||
return collectionKey;
|
return collectionKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,26 +640,24 @@ class CollectionsService {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
final List<Collection> collections = [];
|
final List<Collection> collections = [];
|
||||||
if (response != null) {
|
final c = response.data["collections"];
|
||||||
final c = response.data["collections"];
|
for (final collectionData in c) {
|
||||||
for (final collectionData in c) {
|
final collection = Collection.fromMap(collectionData);
|
||||||
final collection = Collection.fromMap(collectionData);
|
if (collectionData['magicMetadata'] != null) {
|
||||||
if (collectionData['magicMetadata'] != null) {
|
final decryptionKey =
|
||||||
final decryptionKey =
|
_getAndCacheDecryptedKey(collection, source: "fetchCollection");
|
||||||
_getAndCacheDecryptedKey(collection, source: "fetchCollection");
|
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
||||||
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
Sodium.base642bin(collectionData['magicMetadata']['data']),
|
||||||
Sodium.base642bin(collectionData['magicMetadata']['data']),
|
decryptionKey,
|
||||||
decryptionKey,
|
Sodium.base642bin(collectionData['magicMetadata']['header']),
|
||||||
Sodium.base642bin(collectionData['magicMetadata']['header']),
|
);
|
||||||
);
|
collection.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
||||||
collection.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
collection.mMdVersion = collectionData['magicMetadata']['version'];
|
||||||
collection.mMdVersion = collectionData['magicMetadata']['version'];
|
collection.magicMetadata = CollectionMagicMetadata.fromEncodedJson(
|
||||||
collection.magicMetadata = CollectionMagicMetadata.fromEncodedJson(
|
collection.mMdEncodedJson,
|
||||||
collection.mMdEncodedJson,
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
collections.add(collection);
|
|
||||||
}
|
}
|
||||||
|
collections.add(collection);
|
||||||
}
|
}
|
||||||
return collections;
|
return collections;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -700,7 +696,7 @@ class CollectionsService {
|
||||||
final response = await _enteDio.get(
|
final response = await _enteDio.get(
|
||||||
"/collections/$collectionID",
|
"/collections/$collectionID",
|
||||||
);
|
);
|
||||||
assert(response != null && response.data != null);
|
assert(response.data != null);
|
||||||
final collectionData = response.data["collection"];
|
final collectionData = response.data["collection"];
|
||||||
final collection = Collection.fromMap(collectionData);
|
final collection = Collection.fromMap(collectionData);
|
||||||
if (collectionData['magicMetadata'] != null) {
|
if (collectionData['magicMetadata'] != null) {
|
||||||
|
|
|
@ -3,7 +3,6 @@ import 'dart:io';
|
||||||
|
|
||||||
import 'package:computer/computer.dart';
|
import 'package:computer/computer.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:photo_manager/photo_manager.dart';
|
import 'package:photo_manager/photo_manager.dart';
|
||||||
import 'package:photos/core/configuration.dart';
|
import 'package:photos/core/configuration.dart';
|
||||||
|
|
|
@ -97,8 +97,7 @@ class RemoteSyncService {
|
||||||
// remote-sync is done. This is done to avoid adding existing files to
|
// remote-sync is done. This is done to avoid adding existing files to
|
||||||
// the same or different collection when user had already uploaded them
|
// the same or different collection when user had already uploaded them
|
||||||
// before.
|
// before.
|
||||||
final bool hasSyncedBefore =
|
final bool hasSyncedBefore = _prefs.containsKey(_isFirstRemoteSyncDone);
|
||||||
_prefs.containsKey(_isFirstRemoteSyncDone) ?? false;
|
|
||||||
if (hasSyncedBefore) {
|
if (hasSyncedBefore) {
|
||||||
await syncDeviceCollectionFilesForUpload();
|
await syncDeviceCollectionFilesForUpload();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'package:email_validator/email_validator.dart';
|
import 'package:email_validator/email_validator.dart';
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -33,8 +31,8 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
String _cnfPassword = '';
|
String _cnfPassword = '';
|
||||||
double _passwordStrength = 0.0;
|
double _passwordStrength = 0.0;
|
||||||
bool _emailIsValid = false;
|
bool _emailIsValid = false;
|
||||||
bool? _hasAgreedToTOS = true;
|
bool _hasAgreedToTOS = true;
|
||||||
bool? _hasAgreedToE2E = false;
|
bool _hasAgreedToE2E = false;
|
||||||
bool _password1Visible = false;
|
bool _password1Visible = false;
|
||||||
bool _password2Visible = false;
|
bool _password2Visible = false;
|
||||||
bool _passwordsMatch = false;
|
bool _passwordsMatch = false;
|
||||||
|
@ -352,7 +350,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
_hasAgreedToTOS = !_hasAgreedToTOS!;
|
_hasAgreedToTOS = !_hasAgreedToTOS;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
|
@ -363,7 +361,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
side: CheckboxTheme.of(context).side,
|
side: CheckboxTheme.of(context).side,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_hasAgreedToTOS = value;
|
_hasAgreedToTOS = value!;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -431,7 +429,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
_hasAgreedToE2E = !_hasAgreedToE2E!;
|
_hasAgreedToE2E = !_hasAgreedToE2E;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
|
@ -442,7 +440,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
side: CheckboxTheme.of(context).side,
|
side: CheckboxTheme.of(context).side,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_hasAgreedToE2E = value;
|
_hasAgreedToE2E = value!;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -491,8 +489,8 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
|
||||||
bool _isFormValid() {
|
bool _isFormValid() {
|
||||||
return _emailIsValid &&
|
return _emailIsValid &&
|
||||||
_passwordsMatch &&
|
_passwordsMatch &&
|
||||||
_hasAgreedToTOS! &&
|
_hasAgreedToTOS &&
|
||||||
_hasAgreedToE2E! &&
|
_hasAgreedToE2E &&
|
||||||
_passwordIsValid;
|
_passwordIsValid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:photos/ente_theme_data.dart';
|
import 'package:photos/ente_theme_data.dart';
|
||||||
import 'package:photos/services/user_service.dart';
|
import 'package:photos/services/user_service.dart';
|
||||||
|
@ -65,8 +63,7 @@ class _OTTVerificationPageState extends State<OTTVerificationPage> {
|
||||||
body: _getBody(),
|
body: _getBody(),
|
||||||
floatingActionButton: DynamicFAB(
|
floatingActionButton: DynamicFAB(
|
||||||
isKeypadOpen: isKeypadOpen,
|
isKeypadOpen: isKeypadOpen,
|
||||||
isFormValid: !(_verificationCodeController.text == null ||
|
isFormValid: _verificationCodeController.text.isNotEmpty,
|
||||||
_verificationCodeController.text.isEmpty),
|
|
||||||
buttonText: 'Verify',
|
buttonText: 'Verify',
|
||||||
onPressedFunction: () {
|
onPressedFunction: () {
|
||||||
if (widget.isChangeEmail) {
|
if (widget.isChangeEmail) {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
@ -187,10 +185,11 @@ class _PasswordEntryPageState extends State<PasswordEntryPage> {
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: "we cannot decrypt your data",
|
text: "we cannot decrypt your data",
|
||||||
style: Theme.of(context).textTheme.subtitle1!.copyWith(
|
style:
|
||||||
fontSize: 14,
|
Theme.of(context).textTheme.subtitle1!.copyWith(
|
||||||
decoration: TextDecoration.underline,
|
fontSize: 14,
|
||||||
),
|
decoration: TextDecoration.underline,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -321,8 +320,7 @@ class _PasswordEntryPageState extends State<PasswordEntryPage> {
|
||||||
onChanged: (cnfPassword) {
|
onChanged: (cnfPassword) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_passwordInInputConfirmationBox = cnfPassword;
|
_passwordInInputConfirmationBox = cnfPassword;
|
||||||
if (_passwordInInputBox != null ||
|
if (_passwordInInputBox != '') {
|
||||||
_passwordInInputBox != '') {
|
|
||||||
_passwordsMatch = _passwordInInputBox ==
|
_passwordsMatch = _passwordInInputBox ==
|
||||||
_passwordInInputConfirmationBox;
|
_passwordInInputConfirmationBox;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -8,7 +6,6 @@ import 'package:photos/core/configuration.dart';
|
||||||
import 'package:photos/core/errors.dart';
|
import 'package:photos/core/errors.dart';
|
||||||
import 'package:photos/core/event_bus.dart';
|
import 'package:photos/core/event_bus.dart';
|
||||||
import 'package:photos/events/subscription_purchased_event.dart';
|
import 'package:photos/events/subscription_purchased_event.dart';
|
||||||
import 'package:photos/models/key_attributes.dart';
|
|
||||||
import 'package:photos/ui/account/recovery_page.dart';
|
import 'package:photos/ui/account/recovery_page.dart';
|
||||||
import 'package:photos/ui/common/dialogs.dart';
|
import 'package:photos/ui/common/dialogs.dart';
|
||||||
import 'package:photos/ui/common/dynamic_fab.dart';
|
import 'package:photos/ui/common/dynamic_fab.dart';
|
||||||
|
@ -284,10 +281,4 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void validatePreVerificationState(KeyAttributes keyAttributes) {
|
|
||||||
if (keyAttributes == null) {
|
|
||||||
throw Exception("Key Attributes can not be null");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:photos/db/files_db.dart';
|
import 'package:photos/db/files_db.dart';
|
||||||
import 'package:photos/models/collection.dart';
|
import 'package:photos/models/collection.dart';
|
||||||
import 'package:photos/models/file.dart';
|
import 'package:photos/models/file.dart';
|
||||||
|
|
|
@ -358,9 +358,9 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
|
||||||
const Padding(padding: EdgeInsets.only(top: 2)),
|
const Padding(padding: EdgeInsets.only(top: 2)),
|
||||||
Text(
|
Text(
|
||||||
(kDebugMode ? 'inApp: $importedCount : device ' : '') +
|
(kDebugMode ? 'inApp: $importedCount : device ' : '') +
|
||||||
(deviceCollection.count ?? 0).toString() +
|
(deviceCollection.count).toString() +
|
||||||
" item" +
|
" item" +
|
||||||
((deviceCollection.count ?? 0) == 1 ? "" : "s"),
|
((deviceCollection.count) == 1 ? "" : "s"),
|
||||||
textAlign: TextAlign.left,
|
textAlign: TextAlign.left,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
|
|
|
@ -107,7 +107,6 @@ class BottomActionBarWidget extends StatelessWidget {
|
||||||
...?iconButtons,
|
...?iconButtons,
|
||||||
ExpansionIconWidget(expandableController: _expandableController)
|
ExpansionIconWidget(expandableController: _expandableController)
|
||||||
];
|
];
|
||||||
iconButtonsWithExpansionIcon.removeWhere((element) => element == null);
|
|
||||||
return iconButtonsWithExpansionIcon;
|
return iconButtonsWithExpansionIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:photos/theme/ente_theme.dart';
|
import 'package:photos/theme/ente_theme.dart';
|
||||||
|
|
||||||
class KeyboardTopButton extends StatelessWidget {
|
class KeyboardTopButton extends StatelessWidget {
|
||||||
|
|
|
@ -292,7 +292,6 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
|
||||||
case CollectionActionType.restoreFiles:
|
case CollectionActionType.restoreFiles:
|
||||||
return _restoreFilesToCollection(collectionID);
|
return _restoreFilesToCollection(collectionID);
|
||||||
}
|
}
|
||||||
throw AssertionError("unexpected actionType ${widget.actionType}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _moveFilesToCollection(int toCollectionID) async {
|
Future<bool> _moveFilesToCollection(int toCollectionID) async {
|
||||||
|
@ -307,7 +306,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
|
||||||
await CollectionsService.instance.move(
|
await CollectionsService.instance.move(
|
||||||
toCollectionID,
|
toCollectionID,
|
||||||
fromCollectionID,
|
fromCollectionID,
|
||||||
widget.selectedFiles!.files?.toList() ?? <File>[],
|
widget.selectedFiles!.files.toList(),
|
||||||
);
|
);
|
||||||
await dialog.hide();
|
await dialog.hide();
|
||||||
RemoteSyncService.instance.sync(silently: true);
|
RemoteSyncService.instance.sync(silently: true);
|
||||||
|
@ -330,8 +329,8 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
|
||||||
final dialog = createProgressDialog(context, "Restoring files...");
|
final dialog = createProgressDialog(context, "Restoring files...");
|
||||||
await dialog.show();
|
await dialog.show();
|
||||||
try {
|
try {
|
||||||
await CollectionsService.instance.restore(
|
await CollectionsService.instance
|
||||||
toCollectionID, widget.selectedFiles!.files?.toList() ?? <File>[]);
|
.restore(toCollectionID, widget.selectedFiles!.files.toList());
|
||||||
RemoteSyncService.instance.sync(silently: true);
|
RemoteSyncService.instance.sync(silently: true);
|
||||||
widget.selectedFiles?.clearAll();
|
widget.selectedFiles?.clearAll();
|
||||||
await dialog.hide();
|
await dialog.hide();
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
import 'package:flutter/widgets.dart' hide PageView;
|
import 'package:flutter/widgets.dart' hide PageView;
|
||||||
|
@ -211,8 +209,7 @@ class ExtentsPageView extends StatefulWidget {
|
||||||
required this.childrenDelegate,
|
required this.childrenDelegate,
|
||||||
this.dragStartBehavior = DragStartBehavior.start,
|
this.dragStartBehavior = DragStartBehavior.start,
|
||||||
this.openDrawer,
|
this.openDrawer,
|
||||||
}) : assert(childrenDelegate != null),
|
}) : extents = 0,
|
||||||
extents = 0,
|
|
||||||
controller = controller ?? _defaultPageController,
|
controller = controller ?? _defaultPageController,
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
@ -317,7 +314,6 @@ class _PageViewState extends State<ExtentsPageView> {
|
||||||
case Axis.vertical:
|
case Axis.vertical:
|
||||||
return widget.reverse ? AxisDirection.up : AxisDirection.down;
|
return widget.reverse ? AxisDirection.up : AxisDirection.down;
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
import 'package:photos/core/event_bus.dart';
|
import 'package:photos/core/event_bus.dart';
|
||||||
import 'package:photos/ente_theme_data.dart';
|
import 'package:photos/ente_theme_data.dart';
|
||||||
import 'package:photos/events/tab_changed_event.dart';
|
import 'package:photos/events/tab_changed_event.dart';
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -231,7 +229,7 @@ class RefreshIndicatorWidget extends StatelessWidget {
|
||||||
return event!.reason;
|
return event!.reason;
|
||||||
}
|
}
|
||||||
if (event!.status == SyncStatus.error) {
|
if (event!.status == SyncStatus.error) {
|
||||||
return event!.reason ?? "Upload failed";
|
return event!.reason;
|
||||||
}
|
}
|
||||||
if (event!.status == SyncStatus.completedBackup) {
|
if (event!.status == SyncStatus.completedBackup) {
|
||||||
if (event!.wasStopped) {
|
if (event!.wasStopped) {
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:photos/services/update_service.dart';
|
import 'package:photos/services/update_service.dart';
|
||||||
import 'package:photos/theme/ente_theme.dart';
|
import 'package:photos/theme/ente_theme.dart';
|
||||||
|
|
|
@ -224,14 +224,10 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
|
||||||
paymentProvider: stripe,
|
paymentProvider: stripe,
|
||||||
);
|
);
|
||||||
await _dialog.hide();
|
await _dialog.hide();
|
||||||
if (response != null) {
|
final content = widget.actionType == 'buy'
|
||||||
final content = widget.actionType == 'buy'
|
? 'Your purchase was successful'
|
||||||
? 'Your purchase was successful'
|
: 'Your subscription was updated successfully';
|
||||||
: 'Your subscription was updated successfully';
|
await _showExitPageDialog(title: 'Thank you', content: content);
|
||||||
await _showExitPageDialog(title: 'Thank you', content: content);
|
|
||||||
} else {
|
|
||||||
throw Exception("verifySubscription api failed");
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
_logger.severe(error);
|
_logger.severe(error);
|
||||||
await _dialog.hide();
|
await _dialog.hide();
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -79,7 +77,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
||||||
final billingPlans = await _billingService.getBillingPlans();
|
final billingPlans = await _billingService.getBillingPlans();
|
||||||
_freePlan = billingPlans.freePlan;
|
_freePlan = billingPlans.freePlan;
|
||||||
_plans = billingPlans.plans.where((plan) {
|
_plans = billingPlans.plans.where((plan) {
|
||||||
if (plan.stripeID == null || plan.stripeID.isEmpty) {
|
if (plan.stripeID.isEmpty) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final isYearlyPlan = plan.period == 'year';
|
final isYearlyPlan = plan.period == 'year';
|
||||||
|
@ -393,11 +391,11 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
|
||||||
bool foundActivePlan = false;
|
bool foundActivePlan = false;
|
||||||
for (final plan in _plans) {
|
for (final plan in _plans) {
|
||||||
final productID = plan.stripeID;
|
final productID = plan.stripeID;
|
||||||
if (productID == null || productID.isEmpty) {
|
if (productID.isEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final isActive =
|
final isActive = _hasActiveSubscription &&
|
||||||
_hasActiveSubscription && _currentSubscription!.productID == productID;
|
_currentSubscription!.productID == productID;
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
foundActivePlan = true;
|
foundActivePlan = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
@ -166,7 +164,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
|
||||||
: Platform.isAndroid
|
: Platform.isAndroid
|
||||||
? plan.androidID
|
? plan.androidID
|
||||||
: plan.iosID;
|
: plan.iosID;
|
||||||
return productID != null && productID.isNotEmpty;
|
return productID.isNotEmpty;
|
||||||
}).toList();
|
}).toList();
|
||||||
_freePlan = billingPlans.freePlan;
|
_freePlan = billingPlans.freePlan;
|
||||||
_hasLoadedData = true;
|
_hasLoadedData = true;
|
||||||
|
@ -320,11 +318,11 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
|
||||||
bool foundActivePlan = false;
|
bool foundActivePlan = false;
|
||||||
for (final plan in _plans) {
|
for (final plan in _plans) {
|
||||||
final productID = plan.stripeID;
|
final productID = plan.stripeID;
|
||||||
if (productID == null || productID.isEmpty) {
|
if (productID.isEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
final isActive =
|
final isActive = _hasActiveSubscription &&
|
||||||
_hasActiveSubscription && _currentSubscription!.productID == productID;
|
_currentSubscription!.productID == productID;
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
foundActivePlan = true;
|
foundActivePlan = true;
|
||||||
}
|
}
|
||||||
|
@ -375,8 +373,8 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
|
||||||
}
|
}
|
||||||
for (final plan in _plans) {
|
for (final plan in _plans) {
|
||||||
final productID = Platform.isAndroid ? plan.androidID : plan.iosID;
|
final productID = Platform.isAndroid ? plan.androidID : plan.iosID;
|
||||||
final isActive =
|
final isActive = _hasActiveSubscription &&
|
||||||
_hasActiveSubscription && _currentSubscription!.productID == productID;
|
_currentSubscription!.productID == productID;
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
foundActivePlan = true;
|
foundActivePlan = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:logging/logging.dart';
|
|
||||||
import 'package:photos/models/user_details.dart';
|
import 'package:photos/models/user_details.dart';
|
||||||
import 'package:photos/states/user_details_state.dart';
|
import 'package:photos/states/user_details_state.dart';
|
||||||
import 'package:photos/theme/ente_theme.dart';
|
import 'package:photos/theme/ente_theme.dart';
|
||||||
|
@ -11,7 +10,6 @@ class SettingsTitleBarWidget extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final logger = Logger((SettingsTitleBarWidget).toString());
|
|
||||||
final inheritedDetails = InheritedUserDetails.of(context);
|
final inheritedDetails = InheritedUserDetails.of(context);
|
||||||
final userDetails = inheritedDetails?.userDetails;
|
final userDetails = inheritedDetails?.userDetails;
|
||||||
bool isCached = false;
|
bool isCached = false;
|
||||||
|
|
|
@ -499,33 +499,6 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Text _getLinkExpiryTimeWidget() {
|
|
||||||
final int validTill =
|
|
||||||
widget.collection!.publicURLs?.firstOrNull?.validTill ?? 0;
|
|
||||||
if (validTill == 0) {
|
|
||||||
return const Text(
|
|
||||||
'Never',
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.grey,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (validTill < DateTime.now().microsecondsSinceEpoch) {
|
|
||||||
return Text(
|
|
||||||
'Expired',
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.orange[300],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Text(
|
|
||||||
getFormattedTime(DateTime.fromMicrosecondsSinceEpoch(validTill)),
|
|
||||||
style: const TextStyle(
|
|
||||||
color: Colors.grey,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _showDeviceLimitPicker() async {
|
Future<void> _showDeviceLimitPicker() async {
|
||||||
final List<Text> options = [];
|
final List<Text> options = [];
|
||||||
for (int i = 50; i > 0; i--) {
|
for (int i = 50; i > 0; i--) {
|
||||||
|
|
|
@ -22,7 +22,6 @@ class UserAvatarWidget extends StatelessWidget {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final enteTextTheme = getEnteTextTheme(context);
|
|
||||||
final colorScheme = getEnteColorScheme(context);
|
final colorScheme = getEnteColorScheme(context);
|
||||||
final displayChar = (user.name == null || user.name!.isEmpty)
|
final displayChar = (user.name == null || user.name!.isEmpty)
|
||||||
? ((user.email.isEmpty) ? " " : user.email.substring(0, 1))
|
? ((user.email.isEmpty) ? " " : user.email.substring(0, 1))
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
@ -78,13 +77,16 @@ class _AppStorageViewerState extends State<AppStorageViewer> {
|
||||||
allowCacheClear: true,
|
allowCacheClear: true,
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
if (internalUser) {
|
// if (internalUser) {
|
||||||
paths.addAll([
|
paths.addAll([
|
||||||
PathStorageItem.name(appDocumentsDirectory.path, "App Documents Dir"),
|
PathStorageItem.name(appDocumentsDirectory.path, "App Documents Dir"),
|
||||||
PathStorageItem.name(appSupportDirectory.path, "App Support Dir"),
|
PathStorageItem.name(appSupportDirectory.path, "App Support Dir"),
|
||||||
PathStorageItem.name(appTemporaryDirectory.path, "App Temp Dir"),
|
PathStorageItem.name(appTemporaryDirectory.path, "App Temp Dir"),
|
||||||
]);
|
]);
|
||||||
|
if (!Platform.isAndroid) {
|
||||||
|
paths.add(PathStorageItem.name(iOSOnlyTempDirectory, "/tmp directory"));
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() => {});
|
setState(() => {});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:photos/core/constants.dart';
|
import 'package:photos/core/constants.dart';
|
||||||
|
@ -138,7 +136,8 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
|
||||||
} else if (sortKey == SortKey.count) {
|
} else if (sortKey == SortKey.count) {
|
||||||
return second.files.length - first.files.length;
|
return second.files.length - first.files.length;
|
||||||
} else {
|
} else {
|
||||||
return second.files.first.creationTime! - first.files.first.creationTime!;
|
return second.files.first.creationTime! -
|
||||||
|
first.files.first.creationTime!;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -273,7 +272,7 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
|
||||||
children: [
|
children: [
|
||||||
Container(),
|
Container(),
|
||||||
PopupMenuButton(
|
PopupMenuButton(
|
||||||
initialValue: sortKey?.index ?? 0,
|
initialValue: sortKey.index,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.fromLTRB(24, 6, 24, 6),
|
padding: const EdgeInsets.fromLTRB(24, 6, 24, 6),
|
||||||
child: Row(
|
child: Row(
|
||||||
|
@ -473,7 +472,8 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
|
||||||
CollectionsService.instance
|
CollectionsService.instance
|
||||||
.getCollectionByID(file.collectionID!)!
|
.getCollectionByID(file.collectionID!)!
|
||||||
.name!,
|
.name!,
|
||||||
style: Theme.of(context).textTheme.caption!.copyWith(fontSize: 12),
|
style:
|
||||||
|
Theme.of(context).textTheme.caption!.copyWith(fontSize: 12),
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -346,7 +346,9 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
|
||||||
final AssetEntity? newAsset =
|
final AssetEntity? newAsset =
|
||||||
await (PhotoManager.editor.saveImage(result, title: fileName));
|
await (PhotoManager.editor.saveImage(result, title: fileName));
|
||||||
final newFile = await ente.File.fromAsset(
|
final newFile = await ente.File.fromAsset(
|
||||||
widget.originalFile.deviceFolder!, newAsset!);
|
widget.originalFile.deviceFolder!,
|
||||||
|
newAsset!,
|
||||||
|
);
|
||||||
newFile.creationTime = widget.originalFile.creationTime;
|
newFile.creationTime = widget.originalFile.creationTime;
|
||||||
newFile.collectionID = widget.originalFile.collectionID;
|
newFile.collectionID = widget.originalFile.collectionID;
|
||||||
newFile.location = widget.originalFile.location;
|
newFile.location = widget.originalFile.location;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:fast_base58/fast_base58.dart';
|
import 'package:fast_base58/fast_base58.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:page_transition/page_transition.dart';
|
import 'package:page_transition/page_transition.dart';
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:page_transition/page_transition.dart';
|
import 'package:page_transition/page_transition.dart';
|
||||||
import 'package:photos/models/collection.dart';
|
import 'package:photos/models/collection.dart';
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import 'dart:ui';
|
|
||||||
|
|
||||||
import "package:exif/exif.dart";
|
import "package:exif/exif.dart";
|
||||||
import "package:flutter/cupertino.dart";
|
import "package:flutter/cupertino.dart";
|
||||||
import "package:flutter/material.dart";
|
import "package:flutter/material.dart";
|
||||||
|
@ -76,8 +74,8 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
|
||||||
final bool isFileOwner =
|
final bool isFileOwner =
|
||||||
file.ownerID == null || file.ownerID == _currentUserID;
|
file.ownerID == null || file.ownerID == _currentUserID;
|
||||||
late Future<Set<int>> allCollectionIDsOfFile;
|
late Future<Set<int>> allCollectionIDsOfFile;
|
||||||
; //Typing this as Future<Set<T>> as it would be easier to implement showing multiple device folders for a file in the future
|
//Typing this as Future<Set<T>> as it would be easier to implement showing multiple device folders for a file in the future
|
||||||
Future<Set<String>> allDeviceFoldersOfFile =
|
final Future<Set<String>> allDeviceFoldersOfFile =
|
||||||
Future.sync(() => {file.deviceFolder ?? ''});
|
Future.sync(() => {file.deviceFolder ?? ''});
|
||||||
if (fileIsBackedup) {
|
if (fileIsBackedup) {
|
||||||
allCollectionIDsOfFile = FilesDB.instance.getAllCollectionIDsOfFile(
|
allCollectionIDsOfFile = FilesDB.instance.getAllCollectionIDsOfFile(
|
||||||
|
@ -326,9 +324,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
|
||||||
} else {
|
} else {
|
||||||
final fileOwner = CollectionsService.instance
|
final fileOwner = CollectionsService.instance
|
||||||
.getFileOwner(file.ownerID!, file.collectionID);
|
.getFileOwner(file.ownerID!, file.collectionID);
|
||||||
if (fileOwner != null) {
|
addedBy = fileOwner.email;
|
||||||
addedBy = fileOwner.email;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (addedBy == null || addedBy.isEmpty) {
|
if (addedBy == null || addedBy.isEmpty) {
|
||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
|
|
|
@ -226,7 +226,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thumbData != null && mounted) {
|
if (mounted) {
|
||||||
final imageProvider = Image.memory(thumbData).image;
|
final imageProvider = Image.memory(thumbData).image;
|
||||||
_cacheAndRender(imageProvider);
|
_cacheAndRender(imageProvider);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:chewie/chewie.dart';
|
import 'package:chewie/chewie.dart';
|
||||||
|
@ -63,8 +61,7 @@ class _VideoControlsState extends State<VideoControls> {
|
||||||
Column(
|
Column(
|
||||||
children: [
|
children: [
|
||||||
_latestValue != null &&
|
_latestValue != null &&
|
||||||
!_latestValue!.isPlaying &&
|
!_latestValue!.isPlaying &&
|
||||||
_latestValue!.duration == null ||
|
|
||||||
_latestValue!.isBuffering
|
_latestValue!.isBuffering
|
||||||
? const Center(
|
? const Center(
|
||||||
child: CircularProgressIndicator(),
|
child: CircularProgressIndicator(),
|
||||||
|
@ -181,9 +178,8 @@ class _VideoControlsState extends State<VideoControls> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildCurrentPosition(Color? iconColor) {
|
Widget _buildCurrentPosition(Color? iconColor) {
|
||||||
final position = _latestValue != null && _latestValue!.position != null
|
final position =
|
||||||
? _latestValue!.position
|
_latestValue != null ? _latestValue!.position : Duration.zero;
|
||||||
: Duration.zero;
|
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.only(left: 20.0, right: 16.0),
|
margin: const EdgeInsets.only(left: 20.0, right: 16.0),
|
||||||
|
@ -198,9 +194,8 @@ class _VideoControlsState extends State<VideoControls> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildTotalDuration(Color? iconColor) {
|
Widget _buildTotalDuration(Color? iconColor) {
|
||||||
final duration = _latestValue != null && _latestValue!.duration != null
|
final duration =
|
||||||
? _latestValue!.duration
|
_latestValue != null ? _latestValue!.duration : Duration.zero;
|
||||||
: Duration.zero;
|
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(right: 20.0),
|
padding: const EdgeInsets.only(right: 20.0),
|
||||||
|
@ -229,8 +224,7 @@ class _VideoControlsState extends State<VideoControls> {
|
||||||
|
|
||||||
_updateState();
|
_updateState();
|
||||||
|
|
||||||
if ((controller.value != null && controller.value.isPlaying) ||
|
if ((controller.value.isPlaying) || chewieController!.autoPlay) {
|
||||||
chewieController!.autoPlay) {
|
|
||||||
_startHideTimer();
|
_startHideTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,8 +124,10 @@ class _VideoWidgetState extends State<VideoWidget> {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoPlayerController _setVideoPlayerController(
|
VideoPlayerController _setVideoPlayerController({
|
||||||
{String? url, io.File? file}) {
|
String? url,
|
||||||
|
io.File? file,
|
||||||
|
}) {
|
||||||
VideoPlayerController videoPlayerController;
|
VideoPlayerController videoPlayerController;
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
videoPlayerController = VideoPlayerController.network(url);
|
videoPlayerController = VideoPlayerController.network(url);
|
||||||
|
@ -230,7 +232,7 @@ class _VideoWidgetState extends State<VideoWidget> {
|
||||||
if (widget.playbackCallback != null) {
|
if (widget.playbackCallback != null) {
|
||||||
widget.playbackCallback!(_isPlaying);
|
widget.playbackCallback!(_isPlaying);
|
||||||
}
|
}
|
||||||
unawaited(_keepScreenAliveOnPlaying(_isPlaying!));
|
unawaited(_keepScreenAliveOnPlaying(_isPlaying));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
_chewieController = ChewieController(
|
_chewieController = ChewieController(
|
||||||
|
|
|
@ -31,93 +31,88 @@ class DiffFetcher {
|
||||||
);
|
);
|
||||||
final files = <File>[];
|
final files = <File>[];
|
||||||
int latestUpdatedAtTime = 0;
|
int latestUpdatedAtTime = 0;
|
||||||
if (response != null) {
|
final diff = response.data["diff"] as List;
|
||||||
final diff = response.data["diff"] as List;
|
final bool hasMore = response.data["hasMore"] as bool;
|
||||||
final bool hasMore = response.data["hasMore"] as bool;
|
final startTime = DateTime.now();
|
||||||
final startTime = DateTime.now();
|
final existingFiles =
|
||||||
final existingFiles =
|
await FilesDB.instance.getUploadedFileIDs(collectionID);
|
||||||
await FilesDB.instance.getUploadedFileIDs(collectionID);
|
final deletedFiles = <File>[];
|
||||||
final deletedFiles = <File>[];
|
for (final item in diff) {
|
||||||
for (final item in diff) {
|
final file = File();
|
||||||
final file = File();
|
file.uploadedFileID = item["id"];
|
||||||
file.uploadedFileID = item["id"];
|
file.collectionID = item["collectionID"];
|
||||||
file.collectionID = item["collectionID"];
|
file.updationTime = item["updationTime"];
|
||||||
file.updationTime = item["updationTime"];
|
latestUpdatedAtTime = max(latestUpdatedAtTime, file.updationTime!);
|
||||||
latestUpdatedAtTime = max(latestUpdatedAtTime, file.updationTime!);
|
if (item["isDeleted"]) {
|
||||||
if (item["isDeleted"]) {
|
|
||||||
if (existingFiles.contains(file.uploadedFileID)) {
|
|
||||||
deletedFiles.add(file);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (existingFiles.contains(file.uploadedFileID)) {
|
if (existingFiles.contains(file.uploadedFileID)) {
|
||||||
final existingFile = await FilesDB.instance
|
deletedFiles.add(file);
|
||||||
.getUploadedFile(file.uploadedFileID!, file.collectionID!);
|
|
||||||
if (existingFile != null) {
|
|
||||||
file.generatedID = existingFile.generatedID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
file.ownerID = item["ownerID"];
|
continue;
|
||||||
file.encryptedKey = item["encryptedKey"];
|
}
|
||||||
file.keyDecryptionNonce = item["keyDecryptionNonce"];
|
if (existingFiles.contains(file.uploadedFileID)) {
|
||||||
file.fileDecryptionHeader = item["file"]["decryptionHeader"];
|
final existingFile = await FilesDB.instance
|
||||||
file.thumbnailDecryptionHeader =
|
.getUploadedFile(file.uploadedFileID!, file.collectionID!);
|
||||||
item["thumbnail"]["decryptionHeader"];
|
if (existingFile != null) {
|
||||||
file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
|
file.generatedID = existingFile.generatedID;
|
||||||
if (item["info"] != null) {
|
|
||||||
file.fileSize = item["info"]["fileSize"];
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
final fileDecryptionKey = decryptFileKey(file);
|
file.ownerID = item["ownerID"];
|
||||||
final encodedMetadata = await CryptoUtil.decryptChaCha(
|
file.encryptedKey = item["encryptedKey"];
|
||||||
Sodium.base642bin(item["metadata"]["encryptedData"]),
|
file.keyDecryptionNonce = item["keyDecryptionNonce"];
|
||||||
fileDecryptionKey,
|
file.fileDecryptionHeader = item["file"]["decryptionHeader"];
|
||||||
Sodium.base642bin(file.metadataDecryptionHeader!),
|
file.thumbnailDecryptionHeader = item["thumbnail"]["decryptionHeader"];
|
||||||
);
|
file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
|
||||||
final Map<String, dynamic> metadata =
|
if (item["info"] != null) {
|
||||||
jsonDecode(utf8.decode(encodedMetadata));
|
file.fileSize = item["info"]["fileSize"];
|
||||||
file.applyMetadata(metadata);
|
|
||||||
if (item['magicMetadata'] != null) {
|
|
||||||
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
|
||||||
Sodium.base642bin(item['magicMetadata']['data']),
|
|
||||||
fileDecryptionKey,
|
|
||||||
Sodium.base642bin(item['magicMetadata']['header']),
|
|
||||||
);
|
|
||||||
file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
|
||||||
file.mMdVersion = item['magicMetadata']['version'];
|
|
||||||
file.magicMetadata =
|
|
||||||
MagicMetadata.fromEncodedJson(file.mMdEncodedJson!);
|
|
||||||
}
|
|
||||||
if (item['pubMagicMetadata'] != null) {
|
|
||||||
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
|
||||||
Sodium.base642bin(item['pubMagicMetadata']['data']),
|
|
||||||
fileDecryptionKey,
|
|
||||||
Sodium.base642bin(item['pubMagicMetadata']['header']),
|
|
||||||
);
|
|
||||||
file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
|
|
||||||
file.pubMmdVersion = item['pubMagicMetadata']['version'];
|
|
||||||
file.pubMagicMetadata =
|
|
||||||
PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!);
|
|
||||||
}
|
|
||||||
files.add(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final endTime = DateTime.now();
|
final fileDecryptionKey = decryptFileKey(file);
|
||||||
_logger.info(
|
final encodedMetadata = await CryptoUtil.decryptChaCha(
|
||||||
"time for parsing " +
|
Sodium.base642bin(item["metadata"]["encryptedData"]),
|
||||||
files.length.toString() +
|
fileDecryptionKey,
|
||||||
" items within collection " +
|
Sodium.base642bin(file.metadataDecryptionHeader!),
|
||||||
collectionID.toString() +
|
|
||||||
": " +
|
|
||||||
Duration(
|
|
||||||
microseconds: (endTime.microsecondsSinceEpoch -
|
|
||||||
startTime.microsecondsSinceEpoch),
|
|
||||||
).inMilliseconds.toString(),
|
|
||||||
);
|
);
|
||||||
return Diff(files, deletedFiles, hasMore, latestUpdatedAtTime);
|
final Map<String, dynamic> metadata =
|
||||||
} else {
|
jsonDecode(utf8.decode(encodedMetadata));
|
||||||
return Diff(<File>[], <File>[], false, 0);
|
file.applyMetadata(metadata);
|
||||||
|
if (item['magicMetadata'] != null) {
|
||||||
|
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
||||||
|
Sodium.base642bin(item['magicMetadata']['data']),
|
||||||
|
fileDecryptionKey,
|
||||||
|
Sodium.base642bin(item['magicMetadata']['header']),
|
||||||
|
);
|
||||||
|
file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
||||||
|
file.mMdVersion = item['magicMetadata']['version'];
|
||||||
|
file.magicMetadata =
|
||||||
|
MagicMetadata.fromEncodedJson(file.mMdEncodedJson!);
|
||||||
|
}
|
||||||
|
if (item['pubMagicMetadata'] != null) {
|
||||||
|
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
||||||
|
Sodium.base642bin(item['pubMagicMetadata']['data']),
|
||||||
|
fileDecryptionKey,
|
||||||
|
Sodium.base642bin(item['pubMagicMetadata']['header']),
|
||||||
|
);
|
||||||
|
file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
|
||||||
|
file.pubMmdVersion = item['pubMagicMetadata']['version'];
|
||||||
|
file.pubMagicMetadata =
|
||||||
|
PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!);
|
||||||
|
}
|
||||||
|
files.add(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final endTime = DateTime.now();
|
||||||
|
_logger.info(
|
||||||
|
"time for parsing " +
|
||||||
|
files.length.toString() +
|
||||||
|
" items within collection " +
|
||||||
|
collectionID.toString() +
|
||||||
|
": " +
|
||||||
|
Duration(
|
||||||
|
microseconds: (endTime.microsecondsSinceEpoch -
|
||||||
|
startTime.microsecondsSinceEpoch),
|
||||||
|
).inMilliseconds.toString(),
|
||||||
|
);
|
||||||
|
return Diff(files, deletedFiles, hasMore, latestUpdatedAtTime);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
_logger.severe(e, s);
|
_logger.severe(e, s);
|
||||||
rethrow;
|
rethrow;
|
||||||
|
|
|
@ -191,7 +191,7 @@ Future<void> sendEmail(
|
||||||
}) async {
|
}) async {
|
||||||
try {
|
try {
|
||||||
final String clientDebugInfo = await _clientInfo();
|
final String clientDebugInfo = await _clientInfo();
|
||||||
final EmailContent email = EmailContent(
|
final EmailContent emailContent = EmailContent(
|
||||||
to: [
|
to: [
|
||||||
to,
|
to,
|
||||||
],
|
],
|
||||||
|
@ -204,7 +204,7 @@ Future<void> sendEmail(
|
||||||
final Uri params = Uri(
|
final Uri params = Uri(
|
||||||
scheme: 'mailto',
|
scheme: 'mailto',
|
||||||
path: to,
|
path: to,
|
||||||
query: 'subject=${email.subject}&body=${email.body}',
|
query: 'subject=${emailContent.subject}&body=${emailContent.body}',
|
||||||
);
|
);
|
||||||
if (await canLaunchUrl(params)) {
|
if (await canLaunchUrl(params)) {
|
||||||
await launchUrl(params);
|
await launchUrl(params);
|
||||||
|
@ -215,8 +215,8 @@ Future<void> sendEmail(
|
||||||
} else {
|
} else {
|
||||||
final OpenMailAppResult result =
|
final OpenMailAppResult result =
|
||||||
await OpenMailApp.composeNewEmailInMailApp(
|
await OpenMailApp.composeNewEmailInMailApp(
|
||||||
nativePickerTitle: 'Select email app',
|
nativePickerTitle: 'Select emailContent app',
|
||||||
emailContent: email,
|
emailContent: emailContent,
|
||||||
);
|
);
|
||||||
if (!result.didOpen && !result.canOpen) {
|
if (!result.didOpen && !result.canOpen) {
|
||||||
_showNoMailAppsDialog(context, to);
|
_showNoMailAppsDialog(context, to);
|
||||||
|
@ -230,15 +230,13 @@ Future<void> sendEmail(
|
||||||
CupertinoActionSheetAction(
|
CupertinoActionSheetAction(
|
||||||
child: Text(app.name),
|
child: Text(app.name),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
final content = email;
|
final content = emailContent;
|
||||||
if (content != null) {
|
|
||||||
OpenMailApp.composeNewEmailInSpecificMailApp(
|
OpenMailApp.composeNewEmailInSpecificMailApp(
|
||||||
mailApp: app,
|
mailApp: app,
|
||||||
emailContent: content,
|
emailContent: content,
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
OpenMailApp.openSpecificMailApp(app);
|
|
||||||
}
|
|
||||||
Navigator.of(context, rootNavigator: true).pop();
|
Navigator.of(context, rootNavigator: true).pop();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -254,7 +252,7 @@ Future<void> sendEmail(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
_logger.severe("Failed to send email to $to", e);
|
_logger.severe("Failed to send emailContent to $to", e);
|
||||||
_showNoMailAppsDialog(context, to);
|
_showNoMailAppsDialog(context, to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,88 +25,85 @@ class TrashDiffFetcher {
|
||||||
final trashedFiles = <TrashFile>[];
|
final trashedFiles = <TrashFile>[];
|
||||||
final deletedUploadIDs = <int>[];
|
final deletedUploadIDs = <int>[];
|
||||||
final restoredFiles = <TrashFile>[];
|
final restoredFiles = <TrashFile>[];
|
||||||
if (response != null) {
|
|
||||||
final diff = response.data["diff"] as List;
|
|
||||||
final bool hasMore = response.data["hasMore"] as bool;
|
|
||||||
final startTime = DateTime.now();
|
|
||||||
for (final item in diff) {
|
|
||||||
final trash = TrashFile();
|
|
||||||
trash.createdAt = item['createdAt'];
|
|
||||||
trash.updateAt = item['updatedAt'];
|
|
||||||
latestUpdatedAtTime = max(latestUpdatedAtTime, trash.updateAt);
|
|
||||||
if (item["isDeleted"]) {
|
|
||||||
deletedUploadIDs.add(item["file"]["id"]);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
trash.deleteBy = item['deleteBy'];
|
final diff = response.data["diff"] as List;
|
||||||
trash.uploadedFileID = item["file"]["id"];
|
final bool hasMore = response.data["hasMore"] as bool;
|
||||||
trash.collectionID = item["file"]["collectionID"];
|
final startTime = DateTime.now();
|
||||||
trash.updationTime = item["file"]["updationTime"];
|
for (final item in diff) {
|
||||||
trash.ownerID = item["file"]["ownerID"];
|
final trash = TrashFile();
|
||||||
trash.encryptedKey = item["file"]["encryptedKey"];
|
trash.createdAt = item['createdAt'];
|
||||||
trash.keyDecryptionNonce = item["file"]["keyDecryptionNonce"];
|
trash.updateAt = item['updatedAt'];
|
||||||
trash.fileDecryptionHeader = item["file"]["file"]["decryptionHeader"];
|
latestUpdatedAtTime = max(latestUpdatedAtTime, trash.updateAt);
|
||||||
trash.thumbnailDecryptionHeader =
|
if (item["isDeleted"]) {
|
||||||
item["file"]["thumbnail"]["decryptionHeader"];
|
deletedUploadIDs.add(item["file"]["id"]);
|
||||||
trash.metadataDecryptionHeader =
|
continue;
|
||||||
item["file"]["metadata"]["decryptionHeader"];
|
|
||||||
final fileDecryptionKey = decryptFileKey(trash);
|
|
||||||
final encodedMetadata = await CryptoUtil.decryptChaCha(
|
|
||||||
Sodium.base642bin(item["file"]["metadata"]["encryptedData"]),
|
|
||||||
fileDecryptionKey,
|
|
||||||
Sodium.base642bin(trash.metadataDecryptionHeader!),
|
|
||||||
);
|
|
||||||
final Map<String, dynamic> metadata =
|
|
||||||
jsonDecode(utf8.decode(encodedMetadata));
|
|
||||||
trash.applyMetadata(metadata);
|
|
||||||
if (item["file"]['magicMetadata'] != null) {
|
|
||||||
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
|
||||||
Sodium.base642bin(item["file"]['magicMetadata']['data']),
|
|
||||||
fileDecryptionKey,
|
|
||||||
Sodium.base642bin(item["file"]['magicMetadata']['header']),
|
|
||||||
);
|
|
||||||
trash.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
|
||||||
trash.mMdVersion = item["file"]['magicMetadata']['version'];
|
|
||||||
}
|
|
||||||
if (item["file"]['pubMagicMetadata'] != null) {
|
|
||||||
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
|
||||||
Sodium.base642bin(item["file"]['pubMagicMetadata']['data']),
|
|
||||||
fileDecryptionKey,
|
|
||||||
Sodium.base642bin(item["file"]['pubMagicMetadata']['header']),
|
|
||||||
);
|
|
||||||
trash.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
|
|
||||||
trash.pubMmdVersion = item["file"]['pubMagicMetadata']['version'];
|
|
||||||
trash.pubMagicMetadata =
|
|
||||||
PubMagicMetadata.fromEncodedJson(trash.pubMmdEncodedJson!);
|
|
||||||
}
|
|
||||||
if (item['isRestored']) {
|
|
||||||
restoredFiles.add(trash);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
trashedFiles.add(trash);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final endTime = DateTime.now();
|
trash.deleteBy = item['deleteBy'];
|
||||||
_logger.info(
|
trash.uploadedFileID = item["file"]["id"];
|
||||||
"time for parsing " +
|
trash.collectionID = item["file"]["collectionID"];
|
||||||
diff.length.toString() +
|
trash.updationTime = item["file"]["updationTime"];
|
||||||
": " +
|
trash.ownerID = item["file"]["ownerID"];
|
||||||
Duration(
|
trash.encryptedKey = item["file"]["encryptedKey"];
|
||||||
microseconds: (endTime.microsecondsSinceEpoch -
|
trash.keyDecryptionNonce = item["file"]["keyDecryptionNonce"];
|
||||||
startTime.microsecondsSinceEpoch),
|
trash.fileDecryptionHeader = item["file"]["file"]["decryptionHeader"];
|
||||||
).inMilliseconds.toString(),
|
trash.thumbnailDecryptionHeader =
|
||||||
|
item["file"]["thumbnail"]["decryptionHeader"];
|
||||||
|
trash.metadataDecryptionHeader =
|
||||||
|
item["file"]["metadata"]["decryptionHeader"];
|
||||||
|
final fileDecryptionKey = decryptFileKey(trash);
|
||||||
|
final encodedMetadata = await CryptoUtil.decryptChaCha(
|
||||||
|
Sodium.base642bin(item["file"]["metadata"]["encryptedData"]),
|
||||||
|
fileDecryptionKey,
|
||||||
|
Sodium.base642bin(trash.metadataDecryptionHeader!),
|
||||||
);
|
);
|
||||||
return Diff(
|
final Map<String, dynamic> metadata =
|
||||||
trashedFiles,
|
jsonDecode(utf8.decode(encodedMetadata));
|
||||||
restoredFiles,
|
trash.applyMetadata(metadata);
|
||||||
deletedUploadIDs,
|
if (item["file"]['magicMetadata'] != null) {
|
||||||
hasMore,
|
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
||||||
latestUpdatedAtTime,
|
Sodium.base642bin(item["file"]['magicMetadata']['data']),
|
||||||
);
|
fileDecryptionKey,
|
||||||
} else {
|
Sodium.base642bin(item["file"]['magicMetadata']['header']),
|
||||||
return Diff(<TrashFile>[], <TrashFile>[], <int>[], false, 0);
|
);
|
||||||
|
trash.mMdEncodedJson = utf8.decode(utfEncodedMmd);
|
||||||
|
trash.mMdVersion = item["file"]['magicMetadata']['version'];
|
||||||
|
}
|
||||||
|
if (item["file"]['pubMagicMetadata'] != null) {
|
||||||
|
final utfEncodedMmd = await CryptoUtil.decryptChaCha(
|
||||||
|
Sodium.base642bin(item["file"]['pubMagicMetadata']['data']),
|
||||||
|
fileDecryptionKey,
|
||||||
|
Sodium.base642bin(item["file"]['pubMagicMetadata']['header']),
|
||||||
|
);
|
||||||
|
trash.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
|
||||||
|
trash.pubMmdVersion = item["file"]['pubMagicMetadata']['version'];
|
||||||
|
trash.pubMagicMetadata =
|
||||||
|
PubMagicMetadata.fromEncodedJson(trash.pubMmdEncodedJson!);
|
||||||
|
}
|
||||||
|
if (item['isRestored']) {
|
||||||
|
restoredFiles.add(trash);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
trashedFiles.add(trash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final endTime = DateTime.now();
|
||||||
|
_logger.info(
|
||||||
|
"time for parsing " +
|
||||||
|
diff.length.toString() +
|
||||||
|
": " +
|
||||||
|
Duration(
|
||||||
|
microseconds: (endTime.microsecondsSinceEpoch -
|
||||||
|
startTime.microsecondsSinceEpoch),
|
||||||
|
).inMilliseconds.toString(),
|
||||||
|
);
|
||||||
|
return Diff(
|
||||||
|
trashedFiles,
|
||||||
|
restoredFiles,
|
||||||
|
deletedUploadIDs,
|
||||||
|
hasMore,
|
||||||
|
latestUpdatedAtTime,
|
||||||
|
);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
_logger.severe(e, s);
|
_logger.severe(e, s);
|
||||||
rethrow;
|
rethrow;
|
||||||
|
|
Loading…
Add table
Reference in a new issue