diff --git a/lib/src/database/daos/mediafiles.dao.dart b/lib/src/database/daos/mediafiles.dao.dart index 2e5d18dd..234eddf6 100644 --- a/lib/src/database/daos/mediafiles.dao.dart +++ b/lib/src/database/daos/mediafiles.dao.dart @@ -256,4 +256,23 @@ class MediaFilesDao extends DatabaseAccessor )) .get(); } + + Future getCloudOnlyMemoriesCount() async { + final query = select(mediaFiles) + ..where( + (t) => + t.stored.equals(true) & + t.cloudState.equals(CloudState.uploaded.name), + ); + final rows = await query.get(); + + var count = 0; + for (final row in rows) { + final ms = MediaFileService(row); + if (!(ms.storedPath.existsSync() && ms.storedPath.lengthSync() > 0)) { + count++; + } + } + return count; + } } diff --git a/lib/src/localization/generated/app_localizations.dart b/lib/src/localization/generated/app_localizations.dart index df6aaf34..f27f2307 100644 --- a/lib/src/localization/generated/app_localizations.dart +++ b/lib/src/localization/generated/app_localizations.dart @@ -4237,6 +4237,42 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Local only'** String get settingsStorageLocalOnly; + + /// No description provided for @settingsStorageDisableBackupTitle. + /// + /// In en, this message translates to: + /// **'Disable Backup?'** + String get settingsStorageDisableBackupTitle; + + /// No description provided for @settingsStorageDisableBackupBody. + /// + /// In en, this message translates to: + /// **'This will delete all backed up memories from the cloud. There {count, plural, =1 {is *1 image*} other {are *{count} images*}} only stored in the cloud that will be *permanently lost*. Are you sure you want to proceed?'** + String settingsStorageDisableBackupBody(num count); + + /// No description provided for @settingsStorageDisableBackupBtn. + /// + /// In en, this message translates to: + /// **'Disable'** + String get settingsStorageDisableBackupBtn; + + /// No description provided for @settingsStorageDisableBackupAction. + /// + /// In en, this message translates to: + /// **'Disable Cloud Backup'** + String get settingsStorageDisableBackupAction; + + /// No description provided for @settingsStorageSyncNow. + /// + /// In en, this message translates to: + /// **'Sync now'** + String get settingsStorageSyncNow; + + /// No description provided for @settingsStorageSyncUpToDate. + /// + /// In en, this message translates to: + /// **'All memories are up to date.'** + String get settingsStorageSyncUpToDate; } class _AppLocalizationsDelegate diff --git a/lib/src/localization/generated/app_localizations_de.dart b/lib/src/localization/generated/app_localizations_de.dart index f8a094f0..c558af8e 100644 --- a/lib/src/localization/generated/app_localizations_de.dart +++ b/lib/src/localization/generated/app_localizations_de.dart @@ -2448,4 +2448,31 @@ class AppLocalizationsDe extends AppLocalizations { @override String get settingsStorageLocalOnly => 'Nur lokal'; + + @override + String get settingsStorageDisableBackupTitle => 'Backup deaktivieren?'; + + @override + String settingsStorageDisableBackupBody(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '*$count Bilder*, die', + one: '*1 Bild*, das', + ); + return 'Dadurch werden alle gesicherten Erinnerungen aus der Cloud gelöscht. Es gibt $_temp0 nur in der Cloud und nicht lokal gespeichert sind. Diese gehen *dauerhaft verloren*. Fortfahren?'; + } + + @override + String get settingsStorageDisableBackupBtn => 'Deaktivieren'; + + @override + String get settingsStorageDisableBackupAction => 'Cloud-Backup deaktivieren'; + + @override + String get settingsStorageSyncNow => 'Jetzt synchronisieren'; + + @override + String get settingsStorageSyncUpToDate => + 'Alle Memories sind auf dem neuesten Stand.'; } diff --git a/lib/src/localization/generated/app_localizations_en.dart b/lib/src/localization/generated/app_localizations_en.dart index 1b98deda..08afd8c0 100644 --- a/lib/src/localization/generated/app_localizations_en.dart +++ b/lib/src/localization/generated/app_localizations_en.dart @@ -2427,4 +2427,30 @@ class AppLocalizationsEn extends AppLocalizations { @override String get settingsStorageLocalOnly => 'Local only'; + + @override + String get settingsStorageDisableBackupTitle => 'Disable Backup?'; + + @override + String settingsStorageDisableBackupBody(num count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'are *$count images*', + one: 'is *1 image*', + ); + return 'This will delete all backed up memories from the cloud. There $_temp0 only stored in the cloud that will be *permanently lost*. Are you sure you want to proceed?'; + } + + @override + String get settingsStorageDisableBackupBtn => 'Disable'; + + @override + String get settingsStorageDisableBackupAction => 'Disable Cloud Backup'; + + @override + String get settingsStorageSyncNow => 'Sync now'; + + @override + String get settingsStorageSyncUpToDate => 'All memories are up to date.'; } diff --git a/lib/src/localization/translations b/lib/src/localization/translations index bcfb2b02..34c835db 160000 --- a/lib/src/localization/translations +++ b/lib/src/localization/translations @@ -1 +1 @@ -Subproject commit bcfb2b02c59d1e3afe66b310296cb0f03eb75a72 +Subproject commit 34c835db2de08af962b39fb79ec11341b8847926 diff --git a/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart b/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart index d9d4e85c..96ada9c8 100644 --- a/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart +++ b/lib/src/model/protobuf/api/websocket/client_to_server.pb.dart @@ -2472,47 +2472,6 @@ class ApplicationData_SetLoginToken extends $pb.GeneratedMessage { void clearLoginToken() => $_clearField(1); } -class ApplicationData_Deprecated extends $pb.GeneratedMessage { - factory ApplicationData_Deprecated() => create(); - - ApplicationData_Deprecated._(); - - factory ApplicationData_Deprecated.fromBuffer($core.List<$core.int> data, - [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(data, registry); - factory ApplicationData_Deprecated.fromJson($core.String json, - [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(json, registry); - - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - _omitMessageNames ? '' : 'ApplicationData.Deprecated', - package: - const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), - createEmptyInstance: create) - ..hasRequiredFields = false; - - @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ApplicationData_Deprecated clone() => deepCopy(); - @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') - ApplicationData_Deprecated copyWith( - void Function(ApplicationData_Deprecated) updates) => - super.copyWith( - (message) => updates(message as ApplicationData_Deprecated)) - as ApplicationData_Deprecated; - - @$core.override - $pb.BuilderInfo get info_ => _i; - - @$core.pragma('dart2js:noInline') - static ApplicationData_Deprecated create() => ApplicationData_Deprecated._(); - @$core.override - ApplicationData_Deprecated createEmptyInstance() => create(); - @$core.pragma('dart2js:noInline') - static ApplicationData_Deprecated getDefault() => _defaultInstance ??= - $pb.GeneratedMessage.$_defaultFor(create); - static ApplicationData_Deprecated? _defaultInstance; -} - class ApplicationData_RegisterPasswordLessRecovery extends $pb.GeneratedMessage { factory ApplicationData_RegisterPasswordLessRecovery({ @@ -3054,23 +3013,59 @@ class ApplicationData_DeleteMemory extends $pb.GeneratedMessage { void clearMediaId() => $_clearField(1); } +class ApplicationData_DisableMemoriesBackup extends $pb.GeneratedMessage { + factory ApplicationData_DisableMemoriesBackup() => create(); + + ApplicationData_DisableMemoriesBackup._(); + + factory ApplicationData_DisableMemoriesBackup.fromBuffer( + $core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ApplicationData_DisableMemoriesBackup.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ApplicationData.DisableMemoriesBackup', + package: + const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'), + createEmptyInstance: create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ApplicationData_DisableMemoriesBackup clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ApplicationData_DisableMemoriesBackup copyWith( + void Function(ApplicationData_DisableMemoriesBackup) updates) => + super.copyWith((message) => + updates(message as ApplicationData_DisableMemoriesBackup)) + as ApplicationData_DisableMemoriesBackup; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ApplicationData_DisableMemoriesBackup create() => + ApplicationData_DisableMemoriesBackup._(); + @$core.override + ApplicationData_DisableMemoriesBackup createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ApplicationData_DisableMemoriesBackup getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor< + ApplicationData_DisableMemoriesBackup>(create); + static ApplicationData_DisableMemoriesBackup? _defaultInstance; +} + enum ApplicationData_ApplicationData { textMessage, getUserByUsername, getPrekeysByUserId, getUserById, updateGoogleFcmToken, - deprecated9, getCurrentPlanInfos, - deprecated11, getAvailablePlans, - deprecated13, - deprecated14, - deprecated15, - deprecated16, - deprecated17, removeAdditionalUser, - deprecated19, downloadDone, getSignedPrekeyByUserid, updateSignedPrekey, @@ -3089,6 +3084,7 @@ enum ApplicationData_ApplicationData { getMemoriesUrl, getMemoriesUsage, deleteMemory, + disableMemoriesBackup, notSet } @@ -3099,17 +3095,9 @@ class ApplicationData extends $pb.GeneratedMessage { ApplicationData_GetPrekeysByUserId? getPrekeysByUserId, ApplicationData_GetUserById? getUserById, ApplicationData_UpdateGoogleFcmToken? updateGoogleFcmToken, - ApplicationData_Deprecated? deprecated9, ApplicationData_GetCurrentPlanInfos? getCurrentPlanInfos, - ApplicationData_Deprecated? deprecated11, ApplicationData_GetAvailablePlans? getAvailablePlans, - ApplicationData_Deprecated? deprecated13, - ApplicationData_Deprecated? deprecated14, - ApplicationData_Deprecated? deprecated15, - ApplicationData_Deprecated? deprecated16, - ApplicationData_Deprecated? deprecated17, ApplicationData_RemoveAdditionalUser? removeAdditionalUser, - ApplicationData_Deprecated? deprecated19, ApplicationData_DownloadDone? downloadDone, ApplicationData_GetSignedPreKeyByUserId? getSignedPrekeyByUserid, ApplicationData_UpdateSignedPreKey? updateSignedPrekey, @@ -3128,6 +3116,7 @@ class ApplicationData extends $pb.GeneratedMessage { ApplicationData_GetMemoriesUrl? getMemoriesUrl, ApplicationData_GetMemoriesUsage? getMemoriesUsage, ApplicationData_DeleteMemory? deleteMemory, + ApplicationData_DisableMemoriesBackup? disableMemoriesBackup, }) { final result = create(); if (textMessage != null) result.textMessage = textMessage; @@ -3137,19 +3126,11 @@ class ApplicationData extends $pb.GeneratedMessage { if (getUserById != null) result.getUserById = getUserById; if (updateGoogleFcmToken != null) result.updateGoogleFcmToken = updateGoogleFcmToken; - if (deprecated9 != null) result.deprecated9 = deprecated9; if (getCurrentPlanInfos != null) result.getCurrentPlanInfos = getCurrentPlanInfos; - if (deprecated11 != null) result.deprecated11 = deprecated11; if (getAvailablePlans != null) result.getAvailablePlans = getAvailablePlans; - if (deprecated13 != null) result.deprecated13 = deprecated13; - if (deprecated14 != null) result.deprecated14 = deprecated14; - if (deprecated15 != null) result.deprecated15 = deprecated15; - if (deprecated16 != null) result.deprecated16 = deprecated16; - if (deprecated17 != null) result.deprecated17 = deprecated17; if (removeAdditionalUser != null) result.removeAdditionalUser = removeAdditionalUser; - if (deprecated19 != null) result.deprecated19 = deprecated19; if (downloadDone != null) result.downloadDone = downloadDone; if (getSignedPrekeyByUserid != null) result.getSignedPrekeyByUserid = getSignedPrekeyByUserid; @@ -3174,6 +3155,8 @@ class ApplicationData extends $pb.GeneratedMessage { if (getMemoriesUrl != null) result.getMemoriesUrl = getMemoriesUrl; if (getMemoriesUsage != null) result.getMemoriesUsage = getMemoriesUsage; if (deleteMemory != null) result.deleteMemory = deleteMemory; + if (disableMemoriesBackup != null) + result.disableMemoriesBackup = disableMemoriesBackup; return result; } @@ -3193,17 +3176,9 @@ class ApplicationData extends $pb.GeneratedMessage { 3: ApplicationData_ApplicationData.getPrekeysByUserId, 6: ApplicationData_ApplicationData.getUserById, 8: ApplicationData_ApplicationData.updateGoogleFcmToken, - 9: ApplicationData_ApplicationData.deprecated9, 10: ApplicationData_ApplicationData.getCurrentPlanInfos, - 11: ApplicationData_ApplicationData.deprecated11, 12: ApplicationData_ApplicationData.getAvailablePlans, - 13: ApplicationData_ApplicationData.deprecated13, - 14: ApplicationData_ApplicationData.deprecated14, - 15: ApplicationData_ApplicationData.deprecated15, - 16: ApplicationData_ApplicationData.deprecated16, - 17: ApplicationData_ApplicationData.deprecated17, 18: ApplicationData_ApplicationData.removeAdditionalUser, - 19: ApplicationData_ApplicationData.deprecated19, 20: ApplicationData_ApplicationData.downloadDone, 22: ApplicationData_ApplicationData.getSignedPrekeyByUserid, 23: ApplicationData_ApplicationData.updateSignedPrekey, @@ -3222,6 +3197,7 @@ class ApplicationData extends $pb.GeneratedMessage { 36: ApplicationData_ApplicationData.getMemoriesUrl, 37: ApplicationData_ApplicationData.getMemoriesUsage, 38: ApplicationData_ApplicationData.deleteMemory, + 39: ApplicationData_ApplicationData.disableMemoriesBackup, 0: ApplicationData_ApplicationData.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo( @@ -3235,17 +3211,9 @@ class ApplicationData extends $pb.GeneratedMessage { 3, 6, 8, - 9, 10, - 11, 12, - 13, - 14, - 15, - 16, - 17, 18, - 19, 20, 22, 23, @@ -3263,7 +3231,8 @@ class ApplicationData extends $pb.GeneratedMessage { 35, 36, 37, - 38 + 38, + 39 ]) ..aOM(1, _omitFieldNames ? '' : 'textMessage', protoName: 'textMessage', @@ -3283,42 +3252,18 @@ class ApplicationData extends $pb.GeneratedMessage { 8, _omitFieldNames ? '' : 'updateGoogleFcmToken', protoName: 'updateGoogleFcmToken', subBuilder: ApplicationData_UpdateGoogleFcmToken.create) - ..aOM(9, _omitFieldNames ? '' : 'deprecated9', - protoName: 'deprecated_9', - subBuilder: ApplicationData_Deprecated.create) ..aOM( 10, _omitFieldNames ? '' : 'getCurrentPlanInfos', protoName: 'getCurrentPlanInfos', subBuilder: ApplicationData_GetCurrentPlanInfos.create) - ..aOM(11, _omitFieldNames ? '' : 'deprecated11', - protoName: 'deprecated_11', - subBuilder: ApplicationData_Deprecated.create) ..aOM( 12, _omitFieldNames ? '' : 'getAvailablePlans', protoName: 'getAvailablePlans', subBuilder: ApplicationData_GetAvailablePlans.create) - ..aOM(13, _omitFieldNames ? '' : 'deprecated13', - protoName: 'deprecated_13', - subBuilder: ApplicationData_Deprecated.create) - ..aOM(14, _omitFieldNames ? '' : 'deprecated14', - protoName: 'deprecated_14', - subBuilder: ApplicationData_Deprecated.create) - ..aOM(15, _omitFieldNames ? '' : 'deprecated15', - protoName: 'deprecated_15', - subBuilder: ApplicationData_Deprecated.create) - ..aOM(16, _omitFieldNames ? '' : 'deprecated16', - protoName: 'deprecated_16', - subBuilder: ApplicationData_Deprecated.create) - ..aOM(17, _omitFieldNames ? '' : 'deprecated17', - protoName: 'deprecated_17', - subBuilder: ApplicationData_Deprecated.create) ..aOM( 18, _omitFieldNames ? '' : 'removeAdditionalUser', protoName: 'removeAdditionalUser', subBuilder: ApplicationData_RemoveAdditionalUser.create) - ..aOM(19, _omitFieldNames ? '' : 'deprecated19', - protoName: 'deprecated_19', - subBuilder: ApplicationData_Deprecated.create) ..aOM( 20, _omitFieldNames ? '' : 'downloadDone', protoName: 'downloadDone', @@ -3379,6 +3324,9 @@ class ApplicationData extends $pb.GeneratedMessage { ..aOM( 38, _omitFieldNames ? '' : 'deleteMemory', subBuilder: ApplicationData_DeleteMemory.create) + ..aOM( + 39, _omitFieldNames ? '' : 'disableMemoriesBackup', + subBuilder: ApplicationData_DisableMemoriesBackup.create) ..hasRequiredFields = false; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') @@ -3405,17 +3353,9 @@ class ApplicationData extends $pb.GeneratedMessage { @$pb.TagNumber(3) @$pb.TagNumber(6) @$pb.TagNumber(8) - @$pb.TagNumber(9) @$pb.TagNumber(10) - @$pb.TagNumber(11) @$pb.TagNumber(12) - @$pb.TagNumber(13) - @$pb.TagNumber(14) - @$pb.TagNumber(15) - @$pb.TagNumber(16) - @$pb.TagNumber(17) @$pb.TagNumber(18) - @$pb.TagNumber(19) @$pb.TagNumber(20) @$pb.TagNumber(22) @$pb.TagNumber(23) @@ -3434,6 +3374,7 @@ class ApplicationData extends $pb.GeneratedMessage { @$pb.TagNumber(36) @$pb.TagNumber(37) @$pb.TagNumber(38) + @$pb.TagNumber(39) ApplicationData_ApplicationData whichApplicationData() => _ApplicationData_ApplicationDataByTag[$_whichOneof(0)]!; @$pb.TagNumber(1) @@ -3441,17 +3382,9 @@ class ApplicationData extends $pb.GeneratedMessage { @$pb.TagNumber(3) @$pb.TagNumber(6) @$pb.TagNumber(8) - @$pb.TagNumber(9) @$pb.TagNumber(10) - @$pb.TagNumber(11) @$pb.TagNumber(12) - @$pb.TagNumber(13) - @$pb.TagNumber(14) - @$pb.TagNumber(15) - @$pb.TagNumber(16) - @$pb.TagNumber(17) @$pb.TagNumber(18) - @$pb.TagNumber(19) @$pb.TagNumber(20) @$pb.TagNumber(22) @$pb.TagNumber(23) @@ -3470,6 +3403,7 @@ class ApplicationData extends $pb.GeneratedMessage { @$pb.TagNumber(36) @$pb.TagNumber(37) @$pb.TagNumber(38) + @$pb.TagNumber(39) void clearApplicationData() => $_clearField($_whichOneof(0)); @$pb.TagNumber(1) @@ -3531,353 +3465,278 @@ class ApplicationData extends $pb.GeneratedMessage { ApplicationData_UpdateGoogleFcmToken ensureUpdateGoogleFcmToken() => $_ensure(4); - @$pb.TagNumber(9) - ApplicationData_Deprecated get deprecated9 => $_getN(5); - @$pb.TagNumber(9) - set deprecated9(ApplicationData_Deprecated value) => $_setField(9, value); - @$pb.TagNumber(9) - $core.bool hasDeprecated9() => $_has(5); - @$pb.TagNumber(9) - void clearDeprecated9() => $_clearField(9); - @$pb.TagNumber(9) - ApplicationData_Deprecated ensureDeprecated9() => $_ensure(5); - @$pb.TagNumber(10) - ApplicationData_GetCurrentPlanInfos get getCurrentPlanInfos => $_getN(6); + ApplicationData_GetCurrentPlanInfos get getCurrentPlanInfos => $_getN(5); @$pb.TagNumber(10) set getCurrentPlanInfos(ApplicationData_GetCurrentPlanInfos value) => $_setField(10, value); @$pb.TagNumber(10) - $core.bool hasGetCurrentPlanInfos() => $_has(6); + $core.bool hasGetCurrentPlanInfos() => $_has(5); @$pb.TagNumber(10) void clearGetCurrentPlanInfos() => $_clearField(10); @$pb.TagNumber(10) ApplicationData_GetCurrentPlanInfos ensureGetCurrentPlanInfos() => - $_ensure(6); - - @$pb.TagNumber(11) - ApplicationData_Deprecated get deprecated11 => $_getN(7); - @$pb.TagNumber(11) - set deprecated11(ApplicationData_Deprecated value) => $_setField(11, value); - @$pb.TagNumber(11) - $core.bool hasDeprecated11() => $_has(7); - @$pb.TagNumber(11) - void clearDeprecated11() => $_clearField(11); - @$pb.TagNumber(11) - ApplicationData_Deprecated ensureDeprecated11() => $_ensure(7); + $_ensure(5); @$pb.TagNumber(12) - ApplicationData_GetAvailablePlans get getAvailablePlans => $_getN(8); + ApplicationData_GetAvailablePlans get getAvailablePlans => $_getN(6); @$pb.TagNumber(12) set getAvailablePlans(ApplicationData_GetAvailablePlans value) => $_setField(12, value); @$pb.TagNumber(12) - $core.bool hasGetAvailablePlans() => $_has(8); + $core.bool hasGetAvailablePlans() => $_has(6); @$pb.TagNumber(12) void clearGetAvailablePlans() => $_clearField(12); @$pb.TagNumber(12) - ApplicationData_GetAvailablePlans ensureGetAvailablePlans() => $_ensure(8); - - @$pb.TagNumber(13) - ApplicationData_Deprecated get deprecated13 => $_getN(9); - @$pb.TagNumber(13) - set deprecated13(ApplicationData_Deprecated value) => $_setField(13, value); - @$pb.TagNumber(13) - $core.bool hasDeprecated13() => $_has(9); - @$pb.TagNumber(13) - void clearDeprecated13() => $_clearField(13); - @$pb.TagNumber(13) - ApplicationData_Deprecated ensureDeprecated13() => $_ensure(9); - - @$pb.TagNumber(14) - ApplicationData_Deprecated get deprecated14 => $_getN(10); - @$pb.TagNumber(14) - set deprecated14(ApplicationData_Deprecated value) => $_setField(14, value); - @$pb.TagNumber(14) - $core.bool hasDeprecated14() => $_has(10); - @$pb.TagNumber(14) - void clearDeprecated14() => $_clearField(14); - @$pb.TagNumber(14) - ApplicationData_Deprecated ensureDeprecated14() => $_ensure(10); - - @$pb.TagNumber(15) - ApplicationData_Deprecated get deprecated15 => $_getN(11); - @$pb.TagNumber(15) - set deprecated15(ApplicationData_Deprecated value) => $_setField(15, value); - @$pb.TagNumber(15) - $core.bool hasDeprecated15() => $_has(11); - @$pb.TagNumber(15) - void clearDeprecated15() => $_clearField(15); - @$pb.TagNumber(15) - ApplicationData_Deprecated ensureDeprecated15() => $_ensure(11); - - @$pb.TagNumber(16) - ApplicationData_Deprecated get deprecated16 => $_getN(12); - @$pb.TagNumber(16) - set deprecated16(ApplicationData_Deprecated value) => $_setField(16, value); - @$pb.TagNumber(16) - $core.bool hasDeprecated16() => $_has(12); - @$pb.TagNumber(16) - void clearDeprecated16() => $_clearField(16); - @$pb.TagNumber(16) - ApplicationData_Deprecated ensureDeprecated16() => $_ensure(12); - - @$pb.TagNumber(17) - ApplicationData_Deprecated get deprecated17 => $_getN(13); - @$pb.TagNumber(17) - set deprecated17(ApplicationData_Deprecated value) => $_setField(17, value); - @$pb.TagNumber(17) - $core.bool hasDeprecated17() => $_has(13); - @$pb.TagNumber(17) - void clearDeprecated17() => $_clearField(17); - @$pb.TagNumber(17) - ApplicationData_Deprecated ensureDeprecated17() => $_ensure(13); + ApplicationData_GetAvailablePlans ensureGetAvailablePlans() => $_ensure(6); @$pb.TagNumber(18) - ApplicationData_RemoveAdditionalUser get removeAdditionalUser => $_getN(14); + ApplicationData_RemoveAdditionalUser get removeAdditionalUser => $_getN(7); @$pb.TagNumber(18) set removeAdditionalUser(ApplicationData_RemoveAdditionalUser value) => $_setField(18, value); @$pb.TagNumber(18) - $core.bool hasRemoveAdditionalUser() => $_has(14); + $core.bool hasRemoveAdditionalUser() => $_has(7); @$pb.TagNumber(18) void clearRemoveAdditionalUser() => $_clearField(18); @$pb.TagNumber(18) ApplicationData_RemoveAdditionalUser ensureRemoveAdditionalUser() => - $_ensure(14); - - @$pb.TagNumber(19) - ApplicationData_Deprecated get deprecated19 => $_getN(15); - @$pb.TagNumber(19) - set deprecated19(ApplicationData_Deprecated value) => $_setField(19, value); - @$pb.TagNumber(19) - $core.bool hasDeprecated19() => $_has(15); - @$pb.TagNumber(19) - void clearDeprecated19() => $_clearField(19); - @$pb.TagNumber(19) - ApplicationData_Deprecated ensureDeprecated19() => $_ensure(15); + $_ensure(7); @$pb.TagNumber(20) - ApplicationData_DownloadDone get downloadDone => $_getN(16); + ApplicationData_DownloadDone get downloadDone => $_getN(8); @$pb.TagNumber(20) set downloadDone(ApplicationData_DownloadDone value) => $_setField(20, value); @$pb.TagNumber(20) - $core.bool hasDownloadDone() => $_has(16); + $core.bool hasDownloadDone() => $_has(8); @$pb.TagNumber(20) void clearDownloadDone() => $_clearField(20); @$pb.TagNumber(20) - ApplicationData_DownloadDone ensureDownloadDone() => $_ensure(16); + ApplicationData_DownloadDone ensureDownloadDone() => $_ensure(8); @$pb.TagNumber(22) ApplicationData_GetSignedPreKeyByUserId get getSignedPrekeyByUserid => - $_getN(17); + $_getN(9); @$pb.TagNumber(22) set getSignedPrekeyByUserid(ApplicationData_GetSignedPreKeyByUserId value) => $_setField(22, value); @$pb.TagNumber(22) - $core.bool hasGetSignedPrekeyByUserid() => $_has(17); + $core.bool hasGetSignedPrekeyByUserid() => $_has(9); @$pb.TagNumber(22) void clearGetSignedPrekeyByUserid() => $_clearField(22); @$pb.TagNumber(22) ApplicationData_GetSignedPreKeyByUserId ensureGetSignedPrekeyByUserid() => - $_ensure(17); + $_ensure(9); @$pb.TagNumber(23) - ApplicationData_UpdateSignedPreKey get updateSignedPrekey => $_getN(18); + ApplicationData_UpdateSignedPreKey get updateSignedPrekey => $_getN(10); @$pb.TagNumber(23) set updateSignedPrekey(ApplicationData_UpdateSignedPreKey value) => $_setField(23, value); @$pb.TagNumber(23) - $core.bool hasUpdateSignedPrekey() => $_has(18); + $core.bool hasUpdateSignedPrekey() => $_has(10); @$pb.TagNumber(23) void clearUpdateSignedPrekey() => $_clearField(23); @$pb.TagNumber(23) - ApplicationData_UpdateSignedPreKey ensureUpdateSignedPrekey() => $_ensure(18); + ApplicationData_UpdateSignedPreKey ensureUpdateSignedPrekey() => $_ensure(10); @$pb.TagNumber(24) - ApplicationData_DeleteAccount get deleteAccount => $_getN(19); + ApplicationData_DeleteAccount get deleteAccount => $_getN(11); @$pb.TagNumber(24) set deleteAccount(ApplicationData_DeleteAccount value) => $_setField(24, value); @$pb.TagNumber(24) - $core.bool hasDeleteAccount() => $_has(19); + $core.bool hasDeleteAccount() => $_has(11); @$pb.TagNumber(24) void clearDeleteAccount() => $_clearField(24); @$pb.TagNumber(24) - ApplicationData_DeleteAccount ensureDeleteAccount() => $_ensure(19); + ApplicationData_DeleteAccount ensureDeleteAccount() => $_ensure(11); @$pb.TagNumber(25) - ApplicationData_ReportUser get reportUser => $_getN(20); + ApplicationData_ReportUser get reportUser => $_getN(12); @$pb.TagNumber(25) set reportUser(ApplicationData_ReportUser value) => $_setField(25, value); @$pb.TagNumber(25) - $core.bool hasReportUser() => $_has(20); + $core.bool hasReportUser() => $_has(12); @$pb.TagNumber(25) void clearReportUser() => $_clearField(25); @$pb.TagNumber(25) - ApplicationData_ReportUser ensureReportUser() => $_ensure(20); + ApplicationData_ReportUser ensureReportUser() => $_ensure(12); @$pb.TagNumber(26) - ApplicationData_ChangeUsername get changeUsername => $_getN(21); + ApplicationData_ChangeUsername get changeUsername => $_getN(13); @$pb.TagNumber(26) set changeUsername(ApplicationData_ChangeUsername value) => $_setField(26, value); @$pb.TagNumber(26) - $core.bool hasChangeUsername() => $_has(21); + $core.bool hasChangeUsername() => $_has(13); @$pb.TagNumber(26) void clearChangeUsername() => $_clearField(26); @$pb.TagNumber(26) - ApplicationData_ChangeUsername ensureChangeUsername() => $_ensure(21); + ApplicationData_ChangeUsername ensureChangeUsername() => $_ensure(13); @$pb.TagNumber(27) - ApplicationData_IPAPurchase get ipaPurchase => $_getN(22); + ApplicationData_IPAPurchase get ipaPurchase => $_getN(14); @$pb.TagNumber(27) set ipaPurchase(ApplicationData_IPAPurchase value) => $_setField(27, value); @$pb.TagNumber(27) - $core.bool hasIpaPurchase() => $_has(22); + $core.bool hasIpaPurchase() => $_has(14); @$pb.TagNumber(27) void clearIpaPurchase() => $_clearField(27); @$pb.TagNumber(27) - ApplicationData_IPAPurchase ensureIpaPurchase() => $_ensure(22); + ApplicationData_IPAPurchase ensureIpaPurchase() => $_ensure(14); @$pb.TagNumber(28) - ApplicationData_IPAForceCheck get ipaForceCheck => $_getN(23); + ApplicationData_IPAForceCheck get ipaForceCheck => $_getN(15); @$pb.TagNumber(28) set ipaForceCheck(ApplicationData_IPAForceCheck value) => $_setField(28, value); @$pb.TagNumber(28) - $core.bool hasIpaForceCheck() => $_has(23); + $core.bool hasIpaForceCheck() => $_has(15); @$pb.TagNumber(28) void clearIpaForceCheck() => $_clearField(28); @$pb.TagNumber(28) - ApplicationData_IPAForceCheck ensureIpaForceCheck() => $_ensure(23); + ApplicationData_IPAForceCheck ensureIpaForceCheck() => $_ensure(15); @$pb.TagNumber(29) - ApplicationData_AddAdditionalUser get addAdditionalUser => $_getN(24); + ApplicationData_AddAdditionalUser get addAdditionalUser => $_getN(16); @$pb.TagNumber(29) set addAdditionalUser(ApplicationData_AddAdditionalUser value) => $_setField(29, value); @$pb.TagNumber(29) - $core.bool hasAddAdditionalUser() => $_has(24); + $core.bool hasAddAdditionalUser() => $_has(16); @$pb.TagNumber(29) void clearAddAdditionalUser() => $_clearField(29); @$pb.TagNumber(29) - ApplicationData_AddAdditionalUser ensureAddAdditionalUser() => $_ensure(24); + ApplicationData_AddAdditionalUser ensureAddAdditionalUser() => $_ensure(16); @$pb.TagNumber(30) - ApplicationData_SetLoginToken get setLoginToken => $_getN(25); + ApplicationData_SetLoginToken get setLoginToken => $_getN(17); @$pb.TagNumber(30) set setLoginToken(ApplicationData_SetLoginToken value) => $_setField(30, value); @$pb.TagNumber(30) - $core.bool hasSetLoginToken() => $_has(25); + $core.bool hasSetLoginToken() => $_has(17); @$pb.TagNumber(30) void clearSetLoginToken() => $_clearField(30); @$pb.TagNumber(30) - ApplicationData_SetLoginToken ensureSetLoginToken() => $_ensure(25); + ApplicationData_SetLoginToken ensureSetLoginToken() => $_ensure(17); @$pb.TagNumber(31) ApplicationData_RegisterPasswordLessRecovery - get registerPasswordlessRecovery => $_getN(26); + get registerPasswordlessRecovery => $_getN(18); @$pb.TagNumber(31) set registerPasswordlessRecovery( ApplicationData_RegisterPasswordLessRecovery value) => $_setField(31, value); @$pb.TagNumber(31) - $core.bool hasRegisterPasswordlessRecovery() => $_has(26); + $core.bool hasRegisterPasswordlessRecovery() => $_has(18); @$pb.TagNumber(31) void clearRegisterPasswordlessRecovery() => $_clearField(31); @$pb.TagNumber(31) ApplicationData_RegisterPasswordLessRecovery - ensureRegisterPasswordlessRecovery() => $_ensure(26); + ensureRegisterPasswordlessRecovery() => $_ensure(18); @$pb.TagNumber(32) ApplicationData_PasswordlessNotification get passwordlessNotification => - $_getN(27); + $_getN(19); @$pb.TagNumber(32) set passwordlessNotification( ApplicationData_PasswordlessNotification value) => $_setField(32, value); @$pb.TagNumber(32) - $core.bool hasPasswordlessNotification() => $_has(27); + $core.bool hasPasswordlessNotification() => $_has(19); @$pb.TagNumber(32) void clearPasswordlessNotification() => $_clearField(32); @$pb.TagNumber(32) ApplicationData_PasswordlessNotification ensurePasswordlessNotification() => - $_ensure(27); + $_ensure(19); @$pb.TagNumber(33) - ApplicationData_RequestMemoriesUpload get requestMemoriesUpload => $_getN(28); + ApplicationData_RequestMemoriesUpload get requestMemoriesUpload => $_getN(20); @$pb.TagNumber(33) set requestMemoriesUpload(ApplicationData_RequestMemoriesUpload value) => $_setField(33, value); @$pb.TagNumber(33) - $core.bool hasRequestMemoriesUpload() => $_has(28); + $core.bool hasRequestMemoriesUpload() => $_has(20); @$pb.TagNumber(33) void clearRequestMemoriesUpload() => $_clearField(33); @$pb.TagNumber(33) ApplicationData_RequestMemoriesUpload ensureRequestMemoriesUpload() => - $_ensure(28); + $_ensure(20); @$pb.TagNumber(34) - ApplicationData_ConfirmMemoriesUpload get confirmMemoriesUpload => $_getN(29); + ApplicationData_ConfirmMemoriesUpload get confirmMemoriesUpload => $_getN(21); @$pb.TagNumber(34) set confirmMemoriesUpload(ApplicationData_ConfirmMemoriesUpload value) => $_setField(34, value); @$pb.TagNumber(34) - $core.bool hasConfirmMemoriesUpload() => $_has(29); + $core.bool hasConfirmMemoriesUpload() => $_has(21); @$pb.TagNumber(34) void clearConfirmMemoriesUpload() => $_clearField(34); @$pb.TagNumber(34) ApplicationData_ConfirmMemoriesUpload ensureConfirmMemoriesUpload() => - $_ensure(29); + $_ensure(21); @$pb.TagNumber(35) - ApplicationData_GetMemoriesList get getMemoriesList => $_getN(30); + ApplicationData_GetMemoriesList get getMemoriesList => $_getN(22); @$pb.TagNumber(35) set getMemoriesList(ApplicationData_GetMemoriesList value) => $_setField(35, value); @$pb.TagNumber(35) - $core.bool hasGetMemoriesList() => $_has(30); + $core.bool hasGetMemoriesList() => $_has(22); @$pb.TagNumber(35) void clearGetMemoriesList() => $_clearField(35); @$pb.TagNumber(35) - ApplicationData_GetMemoriesList ensureGetMemoriesList() => $_ensure(30); + ApplicationData_GetMemoriesList ensureGetMemoriesList() => $_ensure(22); @$pb.TagNumber(36) - ApplicationData_GetMemoriesUrl get getMemoriesUrl => $_getN(31); + ApplicationData_GetMemoriesUrl get getMemoriesUrl => $_getN(23); @$pb.TagNumber(36) set getMemoriesUrl(ApplicationData_GetMemoriesUrl value) => $_setField(36, value); @$pb.TagNumber(36) - $core.bool hasGetMemoriesUrl() => $_has(31); + $core.bool hasGetMemoriesUrl() => $_has(23); @$pb.TagNumber(36) void clearGetMemoriesUrl() => $_clearField(36); @$pb.TagNumber(36) - ApplicationData_GetMemoriesUrl ensureGetMemoriesUrl() => $_ensure(31); + ApplicationData_GetMemoriesUrl ensureGetMemoriesUrl() => $_ensure(23); @$pb.TagNumber(37) - ApplicationData_GetMemoriesUsage get getMemoriesUsage => $_getN(32); + ApplicationData_GetMemoriesUsage get getMemoriesUsage => $_getN(24); @$pb.TagNumber(37) set getMemoriesUsage(ApplicationData_GetMemoriesUsage value) => $_setField(37, value); @$pb.TagNumber(37) - $core.bool hasGetMemoriesUsage() => $_has(32); + $core.bool hasGetMemoriesUsage() => $_has(24); @$pb.TagNumber(37) void clearGetMemoriesUsage() => $_clearField(37); @$pb.TagNumber(37) - ApplicationData_GetMemoriesUsage ensureGetMemoriesUsage() => $_ensure(32); + ApplicationData_GetMemoriesUsage ensureGetMemoriesUsage() => $_ensure(24); @$pb.TagNumber(38) - ApplicationData_DeleteMemory get deleteMemory => $_getN(33); + ApplicationData_DeleteMemory get deleteMemory => $_getN(25); @$pb.TagNumber(38) set deleteMemory(ApplicationData_DeleteMemory value) => $_setField(38, value); @$pb.TagNumber(38) - $core.bool hasDeleteMemory() => $_has(33); + $core.bool hasDeleteMemory() => $_has(25); @$pb.TagNumber(38) void clearDeleteMemory() => $_clearField(38); @$pb.TagNumber(38) - ApplicationData_DeleteMemory ensureDeleteMemory() => $_ensure(33); + ApplicationData_DeleteMemory ensureDeleteMemory() => $_ensure(25); + + @$pb.TagNumber(39) + ApplicationData_DisableMemoriesBackup get disableMemoriesBackup => $_getN(26); + @$pb.TagNumber(39) + set disableMemoriesBackup(ApplicationData_DisableMemoriesBackup value) => + $_setField(39, value); + @$pb.TagNumber(39) + $core.bool hasDisableMemoriesBackup() => $_has(26); + @$pb.TagNumber(39) + void clearDisableMemoriesBackup() => $_clearField(39); + @$pb.TagNumber(39) + ApplicationData_DisableMemoriesBackup ensureDisableMemoriesBackup() => + $_ensure(26); } class Response_PreKey extends $pb.GeneratedMessage { diff --git a/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart b/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart index f9fa85c5..7245b957 100644 --- a/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart +++ b/lib/src/model/protobuf/api/websocket/client_to_server.pbjson.dart @@ -526,15 +526,6 @@ const ApplicationData$json = { '9': 0, '10': 'updateGoogleFcmToken' }, - { - '1': 'deprecated_9', - '3': 9, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated9' - }, { '1': 'getCurrentPlanInfos', '3': 10, @@ -544,15 +535,6 @@ const ApplicationData$json = { '9': 0, '10': 'getCurrentPlanInfos' }, - { - '1': 'deprecated_11', - '3': 11, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated11' - }, { '1': 'getAvailablePlans', '3': 12, @@ -562,60 +544,6 @@ const ApplicationData$json = { '9': 0, '10': 'getAvailablePlans' }, - { - '1': 'deprecated_13', - '3': 13, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated13' - }, - { - '1': 'deprecated_14', - '3': 14, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated14' - }, - { - '1': 'deprecated_15', - '3': 15, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated15' - }, - { - '1': 'deprecated_16', - '3': 16, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated16' - }, - { - '1': 'deprecated_17', - '3': 17, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated17' - }, - { - '1': 'deprecated_19', - '3': 19, - '4': 1, - '5': 11, - '6': '.client_to_server.ApplicationData.Deprecated', - '9': 0, - '10': 'deprecated19' - }, { '1': 'downloadDone', '3': 20, @@ -787,6 +715,15 @@ const ApplicationData$json = { '9': 0, '10': 'deleteMemory' }, + { + '1': 'disable_memories_backup', + '3': 39, + '4': 1, + '5': 11, + '6': '.client_to_server.ApplicationData.DisableMemoriesBackup', + '9': 0, + '10': 'disableMemoriesBackup' + }, ], '3': [ ApplicationData_TextMessage$json, @@ -807,7 +744,6 @@ const ApplicationData$json = { ApplicationData_DeleteAccount$json, ApplicationData_AddAdditionalUser$json, ApplicationData_SetLoginToken$json, - ApplicationData_Deprecated$json, ApplicationData_RegisterPasswordLessRecovery$json, ApplicationData_PasswordlessNotification$json, ApplicationData_RequestMemoriesUpload$json, @@ -815,11 +751,18 @@ const ApplicationData$json = { ApplicationData_GetMemoriesList$json, ApplicationData_GetMemoriesUrl$json, ApplicationData_GetMemoriesUsage$json, - ApplicationData_DeleteMemory$json + ApplicationData_DeleteMemory$json, + ApplicationData_DisableMemoriesBackup$json ], '8': [ {'1': 'ApplicationData'}, ], + '9': [ + {'1': 9, '2': 10}, + {'1': 11, '2': 12}, + {'1': 13, '2': 18}, + {'1': 19, '2': 20}, + ], }; @$core.Deprecated('Use applicationDataDescriptor instead') @@ -984,11 +927,6 @@ const ApplicationData_SetLoginToken$json = { ], }; -@$core.Deprecated('Use applicationDataDescriptor instead') -const ApplicationData_Deprecated$json = { - '1': 'Deprecated', -}; - @$core.Deprecated('Use applicationDataDescriptor instead') const ApplicationData_RegisterPasswordLessRecovery$json = { '1': 'RegisterPasswordLessRecovery', @@ -1079,6 +1017,11 @@ const ApplicationData_DeleteMemory$json = { ], }; +@$core.Deprecated('Use applicationDataDescriptor instead') +const ApplicationData_DisableMemoriesBackup$json = { + '1': 'DisableMemoriesBackup', +}; + /// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode( 'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dE1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm' @@ -1089,88 +1032,79 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode( 'VzZXJJZEgAUhJnZXRQcmVrZXlzQnlVc2VySWQSUQoLZ2V0VXNlckJ5SWQYBiABKAsyLS5jbGll' 'bnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRVc2VyQnlJZEgAUgtnZXRVc2VyQnlJZB' 'JsChR1cGRhdGVHb29nbGVGY21Ub2tlbhgIIAEoCzI2LmNsaWVudF90b19zZXJ2ZXIuQXBwbGlj' - 'YXRpb25EYXRhLlVwZGF0ZUdvb2dsZUZjbVRva2VuSABSFHVwZGF0ZUdvb2dsZUZjbVRva2VuEl' - 'EKDGRlcHJlY2F0ZWRfORgJIAEoCzIsLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRh' - 'LkRlcHJlY2F0ZWRIAFILZGVwcmVjYXRlZDkSaQoTZ2V0Q3VycmVudFBsYW5JbmZvcxgKIAEoCz' - 'I1LmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkdldEN1cnJlbnRQbGFuSW5mb3NI' - 'AFITZ2V0Q3VycmVudFBsYW5JbmZvcxJTCg1kZXByZWNhdGVkXzExGAsgASgLMiwuY2xpZW50X3' - 'RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuRGVwcmVjYXRlZEgAUgxkZXByZWNhdGVkMTESYwoR' - 'Z2V0QXZhaWxhYmxlUGxhbnMYDCABKAsyMy5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRG' - 'F0YS5HZXRBdmFpbGFibGVQbGFuc0gAUhFnZXRBdmFpbGFibGVQbGFucxJTCg1kZXByZWNhdGVk' - 'XzEzGA0gASgLMiwuY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuRGVwcmVjYXRlZE' - 'gAUgxkZXByZWNhdGVkMTMSUwoNZGVwcmVjYXRlZF8xNBgOIAEoCzIsLmNsaWVudF90b19zZXJ2' - 'ZXIuQXBwbGljYXRpb25EYXRhLkRlcHJlY2F0ZWRIAFIMZGVwcmVjYXRlZDE0ElMKDWRlcHJlY2' - 'F0ZWRfMTUYDyABKAsyLC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5EZXByZWNh' - 'dGVkSABSDGRlcHJlY2F0ZWQxNRJTCg1kZXByZWNhdGVkXzE2GBAgASgLMiwuY2xpZW50X3RvX3' - 'NlcnZlci5BcHBsaWNhdGlvbkRhdGEuRGVwcmVjYXRlZEgAUgxkZXByZWNhdGVkMTYSUwoNZGVw' - 'cmVjYXRlZF8xNxgRIAEoCzIsLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkRlcH' - 'JlY2F0ZWRIAFIMZGVwcmVjYXRlZDE3ElMKDWRlcHJlY2F0ZWRfMTkYEyABKAsyLC5jbGllbnRf' - 'dG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5EZXByZWNhdGVkSABSDGRlcHJlY2F0ZWQxORJUCg' - 'xkb3dubG9hZERvbmUYFCABKAsyLi5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5E' - 'b3dubG9hZERvbmVIAFIMZG93bmxvYWREb25lEnUKF2dldFNpZ25lZFByZWtleUJ5VXNlcmlkGB' - 'YgASgLMjkuY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuR2V0U2lnbmVkUHJlS2V5' - 'QnlVc2VySWRIAFIXZ2V0U2lnbmVkUHJla2V5QnlVc2VyaWQSZgoSdXBkYXRlU2lnbmVkUHJla2' - 'V5GBcgASgLMjQuY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuVXBkYXRlU2lnbmVk' - 'UHJlS2V5SABSEnVwZGF0ZVNpZ25lZFByZWtleRJXCg1kZWxldGVBY2NvdW50GBggASgLMi8uY2' - 'xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuRGVsZXRlQWNjb3VudEgAUg1kZWxldGVB' - 'Y2NvdW50Ek4KCnJlcG9ydFVzZXIYGSABKAsyLC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW' - '9uRGF0YS5SZXBvcnRVc2VySABSCnJlcG9ydFVzZXISWgoOY2hhbmdlVXNlcm5hbWUYGiABKAsy' - 'MC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5DaGFuZ2VVc2VybmFtZUgAUg5jaG' - 'FuZ2VVc2VybmFtZRJRCgtpcGFQdXJjaGFzZRgbIAEoCzItLmNsaWVudF90b19zZXJ2ZXIuQXBw' - 'bGljYXRpb25EYXRhLklQQVB1cmNoYXNlSABSC2lwYVB1cmNoYXNlElcKDWlwYUZvcmNlQ2hlY2' - 'sYHCABKAsyLy5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5JUEFGb3JjZUNoZWNr' - 'SABSDWlwYUZvcmNlQ2hlY2sSbAoUcmVtb3ZlQWRkaXRpb25hbFVzZXIYEiABKAsyNi5jbGllbn' - 'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5SZW1vdmVBZGRpdGlvbmFsVXNlckgAUhRyZW1v' - 'dmVBZGRpdGlvbmFsVXNlchJjChFhZGRBZGRpdGlvbmFsVXNlchgdIAEoCzIzLmNsaWVudF90b1' - '9zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkFkZEFkZGl0aW9uYWxVc2VySABSEWFkZEFkZGl0aW9u' - 'YWxVc2VyElkKD3NldF9sb2dpbl90b2tlbhgeIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuQXBwbG' - 'ljYXRpb25EYXRhLlNldExvZ2luVG9rZW5IAFINc2V0TG9naW5Ub2tlbhKGAQoecmVnaXN0ZXJf' - 'cGFzc3dvcmRsZXNzX3JlY292ZXJ5GB8gASgLMj4uY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdG' - 'lvbkRhdGEuUmVnaXN0ZXJQYXNzd29yZExlc3NSZWNvdmVyeUgAUhxyZWdpc3RlclBhc3N3b3Jk' - 'bGVzc1JlY292ZXJ5EnkKGXBhc3N3b3JkbGVzc19ub3RpZmljYXRpb24YICABKAsyOi5jbGllbn' - 'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5QYXNzd29yZGxlc3NOb3RpZmljYXRpb25IAFIY' - 'cGFzc3dvcmRsZXNzTm90aWZpY2F0aW9uEnEKF3JlcXVlc3RfbWVtb3JpZXNfdXBsb2FkGCEgAS' - 'gLMjcuY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuUmVxdWVzdE1lbW9yaWVzVXBs' - 'b2FkSABSFXJlcXVlc3RNZW1vcmllc1VwbG9hZBJxChdjb25maXJtX21lbW9yaWVzX3VwbG9hZB' - 'giIAEoCzI3LmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkNvbmZpcm1NZW1vcmll' - 'c1VwbG9hZEgAUhVjb25maXJtTWVtb3JpZXNVcGxvYWQSXwoRZ2V0X21lbW9yaWVzX2xpc3QYIy' - 'ABKAsyMS5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRNZW1vcmllc0xpc3RI' - 'AFIPZ2V0TWVtb3JpZXNMaXN0ElwKEGdldF9tZW1vcmllc191cmwYJCABKAsyMC5jbGllbnRfdG' - '9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRNZW1vcmllc1VybEgAUg5nZXRNZW1vcmllc1Vy' - 'bBJiChJnZXRfbWVtb3JpZXNfdXNhZ2UYJSABKAsyMi5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2' - 'F0aW9uRGF0YS5HZXRNZW1vcmllc1VzYWdlSABSEGdldE1lbW9yaWVzVXNhZ2USVQoNZGVsZXRl' - 'X21lbW9yeRgmIAEoCzIuLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkRlbGV0ZU' - '1lbW9yeUgAUgxkZWxldGVNZW1vcnkaagoLVGV4dE1lc3NhZ2USFwoHdXNlcl9pZBgBIAEoA1IG' - 'dXNlcklkEhIKBGJvZHkYAyABKAxSBGJvZHkSIAoJcHVzaF9kYXRhGAQgASgMSABSCHB1c2hEYX' - 'RhiAEBQgwKCl9wdXNoX2RhdGEaLwoRR2V0VXNlckJ5VXNlcm5hbWUSGgoIdXNlcm5hbWUYASAB' - 'KAlSCHVzZXJuYW1lGiwKDkNoYW5nZVVzZXJuYW1lEhoKCHVzZXJuYW1lGAEgASgJUgh1c2Vybm' - 'FtZRo1ChRVcGRhdGVHb29nbGVGY21Ub2tlbhIdCgpnb29nbGVfZmNtGAEgASgJUglnb29nbGVG' - 'Y20aJgoLR2V0VXNlckJ5SWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGhMKEUdldEF2YWlsYW' - 'JsZVBsYW5zGhUKE0dldEN1cnJlbnRQbGFuSW5mb3MaLwoUUmVtb3ZlQWRkaXRpb25hbFVzZXIS' - 'FwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGi0KEkdldFByZWtleXNCeVVzZXJJZBIXCgd1c2VyX2' - 'lkGAEgASgDUgZ1c2VySWQaMgoXR2V0U2lnbmVkUHJlS2V5QnlVc2VySWQSFwoHdXNlcl9pZBgB' - 'IAEoA1IGdXNlcklkGpsBChJVcGRhdGVTaWduZWRQcmVLZXkSKAoQc2lnbmVkX3ByZWtleV9pZB' - 'gBIAEoA1IOc2lnbmVkUHJla2V5SWQSIwoNc2lnbmVkX3ByZWtleRgCIAEoDFIMc2lnbmVkUHJl' - 'a2V5EjYKF3NpZ25lZF9wcmVrZXlfc2lnbmF0dXJlGAMgASgMUhVzaWduZWRQcmVrZXlTaWduYX' - 'R1cmUaNQoMRG93bmxvYWREb25lEiUKDmRvd25sb2FkX3Rva2VuGAEgASgMUg1kb3dubG9hZFRv' - 'a2VuGk4KClJlcG9ydFVzZXISKAoQcmVwb3J0ZWRfdXNlcl9pZBgBIAEoA1IOcmVwb3J0ZWRVc2' - 'VySWQSFgoGcmVhc29uGAIgASgJUgZyZWFzb24acQoLSVBBUHVyY2hhc2USHQoKcHJvZHVjdF9p' - 'ZBgBIAEoCVIJcHJvZHVjdElkEhYKBnNvdXJjZRgCIAEoCVIGc291cmNlEisKEXZlcmlmaWNhdG' - 'lvbl9kYXRhGAMgASgJUhB2ZXJpZmljYXRpb25EYXRhGg8KDUlQQUZvcmNlQ2hlY2saDwoNRGVs' - 'ZXRlQWNjb3VudBosChFBZGRBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySW' - 'QaMAoNU2V0TG9naW5Ub2tlbhIfCgtsb2dpbl90b2tlbhgBIAEoDFIKbG9naW5Ub2tlbhoMCgpE' - 'ZXByZWNhdGVkGo4BChxSZWdpc3RlclBhc3N3b3JkTGVzc1JlY292ZXJ5Ei4KEmVuY3J5cHRlZF' - 'NlcnZlcktleRgBIAEoDFISZW5jcnlwdGVkU2VydmVyS2V5EisKDnBpblVubG9ja1Rva2VuGAIg' - 'ASgMSABSDnBpblVubG9ja1Rva2VuiAEBQhEKD19waW5VbmxvY2tUb2tlbhpwChhQYXNzd29yZG' - 'xlc3NOb3RpZmljYXRpb24SJwoPbm90aWZpY2F0aW9uX2lkGAEgASgJUg5ub3RpZmljYXRpb25J' - 'ZBIrChFlbmNyeXB0ZWRfbWVzc2FnZRgCIAEoDFIQZW5jcnlwdGVkTWVzc2FnZRprChVSZXF1ZX' - 'N0TWVtb3JpZXNVcGxvYWQSEgoEc2l6ZRgBIAEoA1IEc2l6ZRIjCg1vcmlnaW5hbF9kYXRlGAIg' - 'ASgDUgxvcmlnaW5hbERhdGUSGQoIbWVkaWFfaWQYAyABKAlSB21lZGlhSWQaMgoVQ29uZmlybU' - '1lbW9yaWVzVXBsb2FkEhkKCG1lZGlhX2lkGAEgASgJUgdtZWRpYUlkGkgKD0dldE1lbW9yaWVz' - 'TGlzdBIfCgtvZmZzZXRfZGF0ZRgBIAEoA1IKb2Zmc2V0RGF0ZRIUCgVsaW1pdBgCIAEoA1IFbG' - 'ltaXQaSQoOR2V0TWVtb3JpZXNVcmwSGQoIbWVkaWFfaWQYASABKAlSB21lZGlhSWQSHAoJdGh1' - 'bWJuYWlsGAIgASgIUgl0aHVtYm5haWwaEgoQR2V0TWVtb3JpZXNVc2FnZRopCgxEZWxldGVNZW' - '1vcnkSGQoIbWVkaWFfaWQYASABKAlSB21lZGlhSWRCEQoPQXBwbGljYXRpb25EYXRh'); + 'YXRpb25EYXRhLlVwZGF0ZUdvb2dsZUZjbVRva2VuSABSFHVwZGF0ZUdvb2dsZUZjbVRva2VuEm' + 'kKE2dldEN1cnJlbnRQbGFuSW5mb3MYCiABKAsyNS5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0' + 'aW9uRGF0YS5HZXRDdXJyZW50UGxhbkluZm9zSABSE2dldEN1cnJlbnRQbGFuSW5mb3MSYwoRZ2' + 'V0QXZhaWxhYmxlUGxhbnMYDCABKAsyMy5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0' + 'YS5HZXRBdmFpbGFibGVQbGFuc0gAUhFnZXRBdmFpbGFibGVQbGFucxJUCgxkb3dubG9hZERvbm' + 'UYFCABKAsyLi5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5Eb3dubG9hZERvbmVI' + 'AFIMZG93bmxvYWREb25lEnUKF2dldFNpZ25lZFByZWtleUJ5VXNlcmlkGBYgASgLMjkuY2xpZW' + '50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuR2V0U2lnbmVkUHJlS2V5QnlVc2VySWRIAFIX' + 'Z2V0U2lnbmVkUHJla2V5QnlVc2VyaWQSZgoSdXBkYXRlU2lnbmVkUHJla2V5GBcgASgLMjQuY2' + 'xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuVXBkYXRlU2lnbmVkUHJlS2V5SABSEnVw' + 'ZGF0ZVNpZ25lZFByZWtleRJXCg1kZWxldGVBY2NvdW50GBggASgLMi8uY2xpZW50X3RvX3Nlcn' + 'Zlci5BcHBsaWNhdGlvbkRhdGEuRGVsZXRlQWNjb3VudEgAUg1kZWxldGVBY2NvdW50Ek4KCnJl' + 'cG9ydFVzZXIYGSABKAsyLC5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5SZXBvcn' + 'RVc2VySABSCnJlcG9ydFVzZXISWgoOY2hhbmdlVXNlcm5hbWUYGiABKAsyMC5jbGllbnRfdG9f' + 'c2VydmVyLkFwcGxpY2F0aW9uRGF0YS5DaGFuZ2VVc2VybmFtZUgAUg5jaGFuZ2VVc2VybmFtZR' + 'JRCgtpcGFQdXJjaGFzZRgbIAEoCzItLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRh' + 'LklQQVB1cmNoYXNlSABSC2lwYVB1cmNoYXNlElcKDWlwYUZvcmNlQ2hlY2sYHCABKAsyLy5jbG' + 'llbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5JUEFGb3JjZUNoZWNrSABSDWlwYUZvcmNl' + 'Q2hlY2sSbAoUcmVtb3ZlQWRkaXRpb25hbFVzZXIYEiABKAsyNi5jbGllbnRfdG9fc2VydmVyLk' + 'FwcGxpY2F0aW9uRGF0YS5SZW1vdmVBZGRpdGlvbmFsVXNlckgAUhRyZW1vdmVBZGRpdGlvbmFs' + 'VXNlchJjChFhZGRBZGRpdGlvbmFsVXNlchgdIAEoCzIzLmNsaWVudF90b19zZXJ2ZXIuQXBwbG' + 'ljYXRpb25EYXRhLkFkZEFkZGl0aW9uYWxVc2VySABSEWFkZEFkZGl0aW9uYWxVc2VyElkKD3Nl' + 'dF9sb2dpbl90b2tlbhgeIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLl' + 'NldExvZ2luVG9rZW5IAFINc2V0TG9naW5Ub2tlbhKGAQoecmVnaXN0ZXJfcGFzc3dvcmRsZXNz' + 'X3JlY292ZXJ5GB8gASgLMj4uY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuUmVnaX' + 'N0ZXJQYXNzd29yZExlc3NSZWNvdmVyeUgAUhxyZWdpc3RlclBhc3N3b3JkbGVzc1JlY292ZXJ5' + 'EnkKGXBhc3N3b3JkbGVzc19ub3RpZmljYXRpb24YICABKAsyOi5jbGllbnRfdG9fc2VydmVyLk' + 'FwcGxpY2F0aW9uRGF0YS5QYXNzd29yZGxlc3NOb3RpZmljYXRpb25IAFIYcGFzc3dvcmRsZXNz' + 'Tm90aWZpY2F0aW9uEnEKF3JlcXVlc3RfbWVtb3JpZXNfdXBsb2FkGCEgASgLMjcuY2xpZW50X3' + 'RvX3NlcnZlci5BcHBsaWNhdGlvbkRhdGEuUmVxdWVzdE1lbW9yaWVzVXBsb2FkSABSFXJlcXVl' + 'c3RNZW1vcmllc1VwbG9hZBJxChdjb25maXJtX21lbW9yaWVzX3VwbG9hZBgiIAEoCzI3LmNsaW' + 'VudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkNvbmZpcm1NZW1vcmllc1VwbG9hZEgAUhVj' + 'b25maXJtTWVtb3JpZXNVcGxvYWQSXwoRZ2V0X21lbW9yaWVzX2xpc3QYIyABKAsyMS5jbGllbn' + 'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZXRNZW1vcmllc0xpc3RIAFIPZ2V0TWVtb3Jp' + 'ZXNMaXN0ElwKEGdldF9tZW1vcmllc191cmwYJCABKAsyMC5jbGllbnRfdG9fc2VydmVyLkFwcG' + 'xpY2F0aW9uRGF0YS5HZXRNZW1vcmllc1VybEgAUg5nZXRNZW1vcmllc1VybBJiChJnZXRfbWVt' + 'b3JpZXNfdXNhZ2UYJSABKAsyMi5jbGllbnRfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5HZX' + 'RNZW1vcmllc1VzYWdlSABSEGdldE1lbW9yaWVzVXNhZ2USVQoNZGVsZXRlX21lbW9yeRgmIAEo' + 'CzIuLmNsaWVudF90b19zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkRlbGV0ZU1lbW9yeUgAUgxkZW' + 'xldGVNZW1vcnkScQoXZGlzYWJsZV9tZW1vcmllc19iYWNrdXAYJyABKAsyNy5jbGllbnRfdG9f' + 'c2VydmVyLkFwcGxpY2F0aW9uRGF0YS5EaXNhYmxlTWVtb3JpZXNCYWNrdXBIAFIVZGlzYWJsZU' + '1lbW9yaWVzQmFja3VwGmoKC1RleHRNZXNzYWdlEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBIS' + 'CgRib2R5GAMgASgMUgRib2R5EiAKCXB1c2hfZGF0YRgEIAEoDEgAUghwdXNoRGF0YYgBAUIMCg' + 'pfcHVzaF9kYXRhGi8KEUdldFVzZXJCeVVzZXJuYW1lEhoKCHVzZXJuYW1lGAEgASgJUgh1c2Vy' + 'bmFtZRosCg5DaGFuZ2VVc2VybmFtZRIaCgh1c2VybmFtZRgBIAEoCVIIdXNlcm5hbWUaNQoUVX' + 'BkYXRlR29vZ2xlRmNtVG9rZW4SHQoKZ29vZ2xlX2ZjbRgBIAEoCVIJZ29vZ2xlRmNtGiYKC0dl' + 'dFVzZXJCeUlkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBoTChFHZXRBdmFpbGFibGVQbGFucx' + 'oVChNHZXRDdXJyZW50UGxhbkluZm9zGi8KFFJlbW92ZUFkZGl0aW9uYWxVc2VyEhcKB3VzZXJf' + 'aWQYASABKANSBnVzZXJJZBotChJHZXRQcmVrZXlzQnlVc2VySWQSFwoHdXNlcl9pZBgBIAEoA1' + 'IGdXNlcklkGjIKF0dldFNpZ25lZFByZUtleUJ5VXNlcklkEhcKB3VzZXJfaWQYASABKANSBnVz' + 'ZXJJZBqbAQoSVXBkYXRlU2lnbmVkUHJlS2V5EigKEHNpZ25lZF9wcmVrZXlfaWQYASABKANSDn' + 'NpZ25lZFByZWtleUlkEiMKDXNpZ25lZF9wcmVrZXkYAiABKAxSDHNpZ25lZFByZWtleRI2Chdz' + 'aWduZWRfcHJla2V5X3NpZ25hdHVyZRgDIAEoDFIVc2lnbmVkUHJla2V5U2lnbmF0dXJlGjUKDE' + 'Rvd25sb2FkRG9uZRIlCg5kb3dubG9hZF90b2tlbhgBIAEoDFINZG93bmxvYWRUb2tlbhpOCgpS' + 'ZXBvcnRVc2VyEigKEHJlcG9ydGVkX3VzZXJfaWQYASABKANSDnJlcG9ydGVkVXNlcklkEhYKBn' + 'JlYXNvbhgCIAEoCVIGcmVhc29uGnEKC0lQQVB1cmNoYXNlEh0KCnByb2R1Y3RfaWQYASABKAlS' + 'CXByb2R1Y3RJZBIWCgZzb3VyY2UYAiABKAlSBnNvdXJjZRIrChF2ZXJpZmljYXRpb25fZGF0YR' + 'gDIAEoCVIQdmVyaWZpY2F0aW9uRGF0YRoPCg1JUEFGb3JjZUNoZWNrGg8KDURlbGV0ZUFjY291' + 'bnQaLAoRQWRkQWRkaXRpb25hbFVzZXISFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkGjAKDVNldE' + 'xvZ2luVG9rZW4SHwoLbG9naW5fdG9rZW4YASABKAxSCmxvZ2luVG9rZW4ajgEKHFJlZ2lzdGVy' + 'UGFzc3dvcmRMZXNzUmVjb3ZlcnkSLgoSZW5jcnlwdGVkU2VydmVyS2V5GAEgASgMUhJlbmNyeX' + 'B0ZWRTZXJ2ZXJLZXkSKwoOcGluVW5sb2NrVG9rZW4YAiABKAxIAFIOcGluVW5sb2NrVG9rZW6I' + 'AQFCEQoPX3BpblVubG9ja1Rva2VuGnAKGFBhc3N3b3JkbGVzc05vdGlmaWNhdGlvbhInCg9ub3' + 'RpZmljYXRpb25faWQYASABKAlSDm5vdGlmaWNhdGlvbklkEisKEWVuY3J5cHRlZF9tZXNzYWdl' + 'GAIgASgMUhBlbmNyeXB0ZWRNZXNzYWdlGmsKFVJlcXVlc3RNZW1vcmllc1VwbG9hZBISCgRzaX' + 'plGAEgASgDUgRzaXplEiMKDW9yaWdpbmFsX2RhdGUYAiABKANSDG9yaWdpbmFsRGF0ZRIZCght' + 'ZWRpYV9pZBgDIAEoCVIHbWVkaWFJZBoyChVDb25maXJtTWVtb3JpZXNVcGxvYWQSGQoIbWVkaW' + 'FfaWQYASABKAlSB21lZGlhSWQaSAoPR2V0TWVtb3JpZXNMaXN0Eh8KC29mZnNldF9kYXRlGAEg' + 'ASgDUgpvZmZzZXREYXRlEhQKBWxpbWl0GAIgASgDUgVsaW1pdBpJCg5HZXRNZW1vcmllc1VybB' + 'IZCghtZWRpYV9pZBgBIAEoCVIHbWVkaWFJZBIcCgl0aHVtYm5haWwYAiABKAhSCXRodW1ibmFp' + 'bBoSChBHZXRNZW1vcmllc1VzYWdlGikKDERlbGV0ZU1lbW9yeRIZCghtZWRpYV9pZBgBIAEoCV' + 'IHbWVkaWFJZBoXChVEaXNhYmxlTWVtb3JpZXNCYWNrdXBCEQoPQXBwbGljYXRpb25EYXRhSgQI' + 'CRAKSgQICxAMSgQIDRASSgQIExAU'); @$core.Deprecated('Use responseDescriptor instead') const Response$json = { diff --git a/lib/src/services/api/api.service.dart b/lib/src/services/api/api.service.dart index 60f7e91f..ccec7ac1 100644 --- a/lib/src/services/api/api.service.dart +++ b/lib/src/services/api/api.service.dart @@ -781,6 +781,13 @@ class ApiService { return sendRequestSync(req); } + Future disableMemoriesBackup() async { + final get = ApplicationData_DisableMemoriesBackup(); + final appData = ApplicationData()..disableMemoriesBackup = get; + final req = createClientToServerFromApplicationData(appData); + return sendRequestSync(req); + } + Future getUserIdFromUsername(String username) async { final appData = Handshake( getUseridByUsername: Handshake_GetUserIdByUsername(username: username), diff --git a/lib/src/services/memories/memories_cloud.service.dart b/lib/src/services/memories/memories_cloud.service.dart index 4cab3a2a..b90cb86b 100644 --- a/lib/src/services/memories/memories_cloud.service.dart +++ b/lib/src/services/memories/memories_cloud.service.dart @@ -63,10 +63,11 @@ class MemoriesCloudService { Timer? _timer; bool _isProcessing = false; + bool get isProcessing => _isProcessing; final _progressController = - StreamController.broadcast(); - Stream get progressStream => + StreamController.broadcast(); + Stream get progressStream => _progressController.stream; MemoriesBackupProgress? _currentProgress; @@ -97,7 +98,7 @@ class MemoriesCloudService { currentUploadProgress: currentUploadProgress, currentMediaId: currentMediaId, ); - _progressController.add(_currentProgress!); + _progressController.add(_currentProgress); } Future checkUploads() async { @@ -152,6 +153,7 @@ class MemoriesCloudService { } finally { _currentProgress = null; _isProcessing = false; + _progressController.add(null); } } diff --git a/lib/src/visual/views/settings/data_and_storage/manage_storage.view.dart b/lib/src/visual/views/settings/data_and_storage/manage_storage.view.dart index c3ffc121..0af5074a 100644 --- a/lib/src/visual/views/settings/data_and_storage/manage_storage.view.dart +++ b/lib/src/visual/views/settings/data_and_storage/manage_storage.view.dart @@ -1,17 +1,21 @@ import 'dart:async'; +import 'package:drift/drift.dart' hide Column; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:twonly/locator.dart'; import 'package:twonly/src/constants/routes.keys.dart'; import 'package:twonly/src/database/tables/mediafiles.table.dart'; +import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart' as server; import 'package:twonly/src/providers/purchases.provider.dart'; +import 'package:twonly/src/services/mediafiles/mediafile.service.dart'; import 'package:twonly/src/services/memories/memories_cloud.service.dart'; import 'package:twonly/src/services/subscription.service.dart'; import 'package:twonly/src/services/user.service.dart'; import 'package:twonly/src/utils/misc.dart'; +import 'package:twonly/src/visual/components/snackbar.dart'; import 'package:twonly/src/visual/elements/my_button.element.dart'; import 'package:twonly/src/visual/views/settings/data_and_storage/storage_contents.view.dart'; @@ -25,6 +29,7 @@ class ManageStorageView extends StatefulWidget { class _ManageStorageViewState extends State { Map _stats = {}; server.Response_MemoriesUsage? _memoriesUsage; + int _cloudOnlyCount = 0; @override void initState() { @@ -35,14 +40,109 @@ class _ManageStorageViewState extends State { Future _loadStats() async { final stats = await twonlyDB.mediaFilesDao.getStorageStats(); final memoriesUsage = await apiService.getMemoriesUsage(); + final cloudOnlyCount = await twonlyDB.mediaFilesDao + .getCloudOnlyMemoriesCount(); if (mounted) { setState(() { _stats = stats; _memoriesUsage = memoriesUsage; + _cloudOnlyCount = cloudOnlyCount; }); } } + Future _disableBackup() async { + final confirmed = await showDialog( + context: context, + builder: (context) => Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), + backgroundColor: Theme.of(context).colorScheme.surface, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + context.lang.settingsStorageDisableBackupTitle, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + const SizedBox(height: 16), + Text.rich( + TextSpan( + children: formattedText( + context, + context.lang.settingsStorageDisableBackupBody( + _cloudOnlyCount, + ), + textColor: Theme.of( + context, + ).colorScheme.onSurface.withValues(alpha: 0.8), + ), + ), + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 15), + ), + const SizedBox(height: 24), + Row( + children: [ + Expanded( + child: MyButton( + variant: MyButtonVariant.secondaryMiddle, + onPressed: () => Navigator.pop(context, false), + child: Text(context.lang.galleryCancel), + ), + ), + const SizedBox(width: 12), + Expanded( + child: MyButton( + variant: MyButtonVariant.errorMiddle, + onPressed: () => Navigator.pop(context, true), + child: Text(context.lang.settingsStorageDisableBackupBtn), + ), + ), + ], + ), + ], + ), + ), + ), + ); + + if (confirmed == true) { + try { + await apiService.disableMemoriesBackup(); + final allMedias = await (twonlyDB.select( + twonlyDB.mediaFiles, + )..where((t) => t.stored.equals(true))).get(); + for (final media in allMedias) { + final ms = MediaFileService(media); + if (!ms.storedPath.existsSync()) { + ms.fullMediaRemoval(); + await twonlyDB.mediaFilesDao.deleteMediaFile(media.mediaId); + } + } + await twonlyDB.mediaFilesDao.updateAllMediaFiles( + const MediaFilesCompanion( + cloudState: Value(CloudState.none), + ), + ); + await UserService.update((u) => u.isCloudBackupEnabled = false); + await _loadStats(); + } catch (e) { + if (mounted) { + showSnackbar(context, e.toString()); + } + } + } + } + @override Widget build(BuildContext context) { final currentPlan = context.watch().plan; @@ -207,28 +307,84 @@ class _ManageStorageViewState extends State { ), ), ), - StreamBuilder( + StreamBuilder( initialData: memoriesCloudService.currentProgress, stream: memoriesCloudService.progressStream, builder: (context, snapshot) { final progress = snapshot.data; - if (progress == null || progress.totalPending == 0) { - return const SizedBox.shrink(); - } - final percent = - (progress.currentUploaded / progress.totalPending) + - (progress.currentUploadProgress / progress.totalPending); + final isSyncing = + progress != null && progress.totalPending > 0; + final percent = isSyncing + ? ((progress.currentUploaded / progress.totalPending) + + (progress.currentUploadProgress / + progress.totalPending)) + .clamp(0.0, 1.0) + : 0.0; + return Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const SizedBox(height: 12), - Text( - 'Syncing: ${progress.currentUploaded} / ${progress.totalPending} files (${(percent * 100).toStringAsFixed(1)}%)', - style: const TextStyle(fontSize: 14), + if (isSyncing) ...[ + const SizedBox(height: 12), + Text( + 'Syncing: ${progress.currentUploaded} / ${progress.totalPending} files (${(percent * 100).toStringAsFixed(1)}%)', + style: const TextStyle(fontSize: 14), + ), + const SizedBox(height: 6), + LinearProgressIndicator( + value: percent, + ), + ], + const SizedBox(height: 16), + Align( + child: MyButton( + variant: MyButtonVariant.primaryDense, + onPressed: isSyncing + ? null + : () async { + final memories = await twonlyDB.mediaFilesDao + .getMemoriesToBackup(); + if (memories.isEmpty) { + if (context.mounted) { + showSnackbar( + context, + context + .lang + .settingsStorageSyncUpToDate, + ); + } + } else { + unawaited( + memoriesCloudService.checkUploads(), + ); + } + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.sync, size: 18), + const SizedBox(width: 8), + Text(context.lang.settingsStorageSyncNow), + ], + ), + ), ), - const SizedBox(height: 6), - LinearProgressIndicator( - value: percent.clamp(0.0, 1.0), + const SizedBox(height: 12), + Align( + child: MyButton( + variant: MyButtonVariant.secondaryDense, + onPressed: _disableBackup, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.cloud_off_outlined, size: 18), + const SizedBox(width: 8), + Text( + context.lang.settingsStorageDisableBackupAction, + ), + ], + ), + ), ), ], ); diff --git a/lib/src/visual/views/settings/data_and_storage/storage_contents.view.dart b/lib/src/visual/views/settings/data_and_storage/storage_contents.view.dart index c8f00f6b..62b3ebf2 100644 --- a/lib/src/visual/views/settings/data_and_storage/storage_contents.view.dart +++ b/lib/src/visual/views/settings/data_and_storage/storage_contents.view.dart @@ -60,8 +60,7 @@ class _StorageContentsViewState extends State { switch (_sortOption) { case StorageSortOption.size: storedFiles.sort( - (a, b) => - (b.sizeInBytes ?? 0).compareTo(a.sizeInBytes ?? 0), + (a, b) => (b.sizeInBytes ?? 0).compareTo(a.sizeInBytes ?? 0), ); case StorageSortOption.newest: storedFiles.sort((a, b) => b.createdAt.compareTo(a.createdAt)); @@ -83,7 +82,9 @@ class _StorageContentsViewState extends State { : null, title: isSelecting ? Text( - context.lang.memoriesSelectedCount(_selectedMediaIds.length), + context.lang.memoriesSelectedCount( + _selectedMediaIds.length, + ), style: const TextStyle(fontWeight: FontWeight.bold), ) : Text(context.lang.settingsStorageContents), @@ -98,61 +99,60 @@ class _StorageContentsViewState extends State { body: snapshot.connectionState == ConnectionState.waiting ? const Center(child: CircularProgressIndicator()) : snapshot.hasError - ? Center(child: Text('Error: ${snapshot.error}')) - : storedFiles.isEmpty - ? Center( - child: Text( - context.lang.settingsStorageNoContents, - style: Theme.of(context) - .textTheme - .bodyLarge - ?.copyWith(color: Colors.grey), + ? Center(child: Text('Error: ${snapshot.error}')) + : storedFiles.isEmpty + ? Center( + child: Text( + context.lang.settingsStorageNoContents, + style: Theme.of( + context, + ).textTheme.bodyLarge?.copyWith(color: Colors.grey), + ), + ) + : Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + child: Align( + alignment: Alignment.centerLeft, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + _buildChip( + StorageSortOption.size, + context.lang.settingsStorageSortStorage, + ), + const SizedBox(width: 8), + _buildChip( + StorageSortOption.newest, + context.lang.settingsStorageSortNewest, + ), + const SizedBox(width: 8), + _buildChip( + StorageSortOption.oldest, + context.lang.settingsStorageSortOldest, + ), + ], ), - ) - : Column( - children: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 4, - ), - child: Align( - alignment: Alignment.centerLeft, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: [ - _buildChip( - StorageSortOption.size, - context.lang.settingsStorageSortStorage, - ), - const SizedBox(width: 8), - _buildChip( - StorageSortOption.newest, - context.lang.settingsStorageSortNewest, - ), - const SizedBox(width: 8), - _buildChip( - StorageSortOption.oldest, - context.lang.settingsStorageSortOldest, - ), - ], - ), - ), - ), - ), - const Divider(height: 1), - Expanded( - child: ListView.builder( - itemCount: storedFiles.length, - itemBuilder: (context, index) { - final file = storedFiles[index]; - return _buildListItem(context, file); - }, - ), - ), - ], ), + ), + ), + const Divider(height: 1), + Expanded( + child: ListView.builder( + itemCount: storedFiles.length, + itemBuilder: (context, index) { + final file = storedFiles[index]; + return _buildListItem(context, file); + }, + ), + ), + ], + ), ); }, ); @@ -183,8 +183,8 @@ class _StorageContentsViewState extends State { final isSelecting = _selectedMediaIds.isNotEmpty; final ms = MediaFileService(file); - final hasStored = file.stored || - (ms.storedPath.existsSync() && ms.storedPath.lengthSync() > 0); + final isLocal = + ms.storedPath.existsSync() && ms.storedPath.lengthSync() > 0; final IconData statusIcon; final String statusText; @@ -197,7 +197,7 @@ class _StorageContentsViewState extends State { statusIcon = Icons.cloud_upload_outlined; statusText = context.lang.settingsStorageLocalOnly; case CloudState.uploaded: - if (hasStored) { + if (isLocal) { statusIcon = Icons.cloud_done_outlined; statusText = context.lang.settingsStorageLocalAndCloud; } else { @@ -260,16 +260,14 @@ class _StorageContentsViewState extends State { final ms = MediaFileService(file); final isVideo = file.type == MediaType.video; - final imgFile = ms.thumbnailPath.existsSync() && - ms.thumbnailPath.lengthSync() > 0 + final imgFile = + ms.thumbnailPath.existsSync() && ms.thumbnailPath.lengthSync() > 0 ? ms.thumbnailPath : ((file.type == MediaType.image || file.type == MediaType.gif) && - ms.storedPath.existsSync() && - ms.storedPath.lengthSync() > 0) + ms.storedPath.existsSync() && + ms.storedPath.lengthSync() > 0) ? ms.storedPath - : (ms.tempPath.existsSync() && - ms.tempPath.lengthSync() > 0 && - !isVideo) + : (ms.tempPath.existsSync() && ms.tempPath.lengthSync() > 0 && !isVideo) ? ms.tempPath : null; @@ -294,16 +292,15 @@ class _StorageContentsViewState extends State { ), ) : file.blurhash != null - ? BlurHash( - hash: file.blurhash!, - optimizationMode: - BlurHashOptimizationMode.approximation, - ) - : const Icon( - Icons.image_outlined, - size: 24, - color: Colors.grey, - ), + ? BlurHash( + hash: file.blurhash!, + optimizationMode: BlurHashOptimizationMode.approximation, + ) + : const Icon( + Icons.image_outlined, + size: 24, + color: Colors.grey, + ), ), if (isVideo) Container( @@ -336,11 +333,12 @@ class _StorageContentsViewState extends State { if (deleteCompletely == null) return; try { - MediaFileService(file).fullMediaRemoval(); - await twonlyDB.mediaFilesDao.deleteMediaFile(file.mediaId); - if (deleteCompletely) { + await twonlyDB.mediaFilesDao.deleteMediaFile(file.mediaId); unawaited(apiService.deleteMemory(file.mediaId)); + MediaFileService(file).fullMediaRemoval(); + } else { + MediaFileService(file).storedPath.deleteSync(); } if (context.mounted) { @@ -360,15 +358,19 @@ class _StorageContentsViewState extends State { } } - Future _batchDelete(BuildContext context, List allFiles) async { + Future _batchDelete( + BuildContext context, + List allFiles, + ) async { final selectedCount = _selectedMediaIds.length; if (selectedCount == 0) return; final selectedFiles = allFiles .where((file) => _selectedMediaIds.contains(file.mediaId)) .toList(); - final hasAnyCloudBackup = - selectedFiles.any((file) => file.cloudState == CloudState.uploaded); + final hasAnyCloudBackup = selectedFiles.any( + (file) => file.cloudState == CloudState.uploaded, + ); final deleteCompletely = await showDeleteMemoriesDialog( context: context, @@ -380,11 +382,12 @@ class _StorageContentsViewState extends State { try { for (final file in selectedFiles) { - MediaFileService(file).fullMediaRemoval(); - await twonlyDB.mediaFilesDao.deleteMediaFile(file.mediaId); - if (deleteCompletely) { + await twonlyDB.mediaFilesDao.deleteMediaFile(file.mediaId); unawaited(apiService.deleteMemory(file.mediaId)); + MediaFileService(file).fullMediaRemoval(); + } else { + MediaFileService(file).storedPath.deleteSync(); } }