From d5f8c9eb24fbea8fca6d8d1c7e65fadebaaa000e Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:40:15 +0530 Subject: [PATCH 01/19] Add notification widget to packages/ui --- .../lib/components/notification_widget.dart | 265 ++++++++++++++++++ mobile/packages/ui/pubspec.lock | 118 ++++++++ mobile/packages/ui/pubspec.yaml | 3 +- 3 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 mobile/packages/ui/lib/components/notification_widget.dart diff --git a/mobile/packages/ui/lib/components/notification_widget.dart b/mobile/packages/ui/lib/components/notification_widget.dart new file mode 100644 index 0000000000..fb4761fbc5 --- /dev/null +++ b/mobile/packages/ui/lib/components/notification_widget.dart @@ -0,0 +1,265 @@ +import "package:ente_ui/components/buttons/icon_button_widget.dart"; +import "package:ente_ui/theme/colors.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_ui/theme/ente_theme_data.dart"; +import "package:ente_ui/theme/text_style.dart"; +import 'package:flutter/material.dart'; +import "package:flutter_animate/flutter_animate.dart"; + +// CreateNotificationType enum +enum NotificationType { + warning, + banner, + greenBanner, + goldenBanner, + notice, +} + +class NotificationWidget extends StatelessWidget { + final IconData startIcon; + final IconData? actionIcon; + final Widget? actionWidget; + final String text; + final String? subText; + final GestureTapCallback onTap; + final NotificationType type; + final bool isBlackFriday; + final TextStyle? mainTextStyle; + + const NotificationWidget({ + super.key, + required this.startIcon, + required this.actionIcon, + required this.text, + required this.onTap, + this.mainTextStyle, + this.isBlackFriday = false, + this.subText, + this.actionWidget, + this.type = NotificationType.warning, + }); + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + EnteTextTheme textTheme = getEnteTextTheme(context); + TextStyle mainTextStyle = this.mainTextStyle ?? darkTextTheme.bodyBold; + TextStyle subTextStyle = darkTextTheme.miniMuted; + LinearGradient? backgroundGradient; + Color? backgroundColor; + EnteColorScheme strokeColorScheme = darkScheme; + List? boxShadow; + switch (type) { + case NotificationType.warning: + backgroundColor = warning500; + break; + case NotificationType.banner: + textTheme = getEnteTextTheme(context); + backgroundColor = colorScheme.backgroundElevated2; + mainTextStyle = textTheme.bodyBold; + subTextStyle = textTheme.miniMuted; + strokeColorScheme = colorScheme; + boxShadow = [ + BoxShadow(color: Colors.black.withValues(alpha: 0.25), blurRadius: 1), + ]; + break; + case NotificationType.goldenBanner: + backgroundGradient = LinearGradient( + colors: [colorScheme.golden700, colorScheme.golden500], + stops: const [0.25, 1], + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + ); + boxShadow = Theme.of(context).colorScheme.enteTheme.shadowMenu; + break; + case NotificationType.greenBanner: + backgroundGradient = LinearGradient( + colors: [ + getEnteColorScheme(context).primary700, + getEnteColorScheme(context).primary500, + ], + stops: const [0.25, 1], + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + ); + boxShadow = Theme.of(context).colorScheme.enteTheme.shadowMenu; + break; + case NotificationType.notice: + backgroundColor = colorScheme.backgroundElevated2; + mainTextStyle = textTheme.bodyBold; + subTextStyle = textTheme.miniMuted; + strokeColorScheme = colorScheme; + boxShadow = Theme.of(context).colorScheme.enteTheme.shadowMenu; + break; + } + return Center( + child: GestureDetector( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(8), + ), + boxShadow: boxShadow, + color: backgroundColor, + gradient: backgroundGradient, + ), + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 12, + vertical: actionWidget != null ? 12 : 8, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + isBlackFriday + ? Icon( + startIcon, + size: 36, + color: strokeColorScheme.strokeBase, + ) + .animate( + onPlay: (controller) => + controller.repeat(reverse: true), + delay: 2000.ms, + ) + .shake( + duration: 500.ms, + hz: 6, + delay: 1600.ms, + ) + .scale( + duration: 500.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.1, 1.1), + delay: 1600.ms, + // curve: Curves.easeInOut, + ) + : Icon( + startIcon, + size: 36, + color: strokeColorScheme.strokeBase, + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + text, + style: mainTextStyle, + textAlign: TextAlign.left, + ), + subText != null + ? Text( + subText!, + style: subTextStyle, + ) + : const SizedBox.shrink(), + ], + ), + ), + const SizedBox(width: 12), + if (actionWidget != null) + actionWidget! + else if (actionIcon != null) + IconButtonWidget( + icon: actionIcon!, + iconButtonType: IconButtonType.rounded, + iconColor: strokeColorScheme.strokeBase, + defaultColor: strokeColorScheme.fillFaint, + pressedColor: strokeColorScheme.fillMuted, + onTap: onTap, + ), + ], + ), + ), + ), + ), + ); + } +} + +class NotificationTipWidget extends StatelessWidget { + final String name; + const NotificationTipWidget(this.name, {super.key}); + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final textTheme = getEnteTextTheme(context); + return Container( + padding: const EdgeInsets.fromLTRB(16, 12, 12, 12), + decoration: BoxDecoration( + border: Border.all(color: colorScheme.strokeFaint), + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 12, + child: Text( + name, + style: textTheme.miniFaint, + ), + ), + Flexible( + flex: 2, + child: Icon( + Icons.tips_and_updates_outlined, + color: colorScheme.strokeFaint, + size: 36, + ), + ), + ], + ), + ); + } +} + +class NotificationNoteWidget extends StatelessWidget { + final String note; + const NotificationNoteWidget(this.note, {super.key}); + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final textTheme = getEnteTextTheme(context); + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + decoration: BoxDecoration( + border: Border.all(color: colorScheme.strokeMuted), + color: colorScheme.backgroundBase, + borderRadius: const BorderRadius.all(Radius.circular(8)), + ), + child: Row( + children: [ + Icon( + Icons.info, + color: colorScheme.strokeMuted, + size: 36, + ), + const SizedBox( + width: 12, + ), + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Note", + style: textTheme.miniFaint, + ), + const SizedBox(height: 2), + Text( + note, + style: textTheme.smallMuted, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/mobile/packages/ui/pubspec.lock b/mobile/packages/ui/pubspec.lock index 187c952959..f76049e6c2 100644 --- a/mobile/packages/ui/pubspec.lock +++ b/mobile/packages/ui/pubspec.lock @@ -73,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cronet_http: + dependency: transitive + description: + name: cronet_http + sha256: "1b99ad5ae81aa9d2f12900e5f17d3681f3828629bb7f7fe7ad88076a34209840" + url: "https://pub.dev" + source: hosted + version: "1.5.0" cross_file: dependency: transitive description: @@ -97,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + cupertino_http: + dependency: transitive + description: + name: cupertino_http + sha256: "72187f715837290a63479a5b0ae709f4fedad0ed6bd0441c275eceaa02d5abae" + url: "https://pub.dev" + source: hosted + version: "2.3.0" device_info_plus: dependency: transitive description: @@ -174,6 +190,20 @@ packages: relative: true source: path version: "1.0.0" + ente_network: + dependency: "direct overridden" + description: + path: "../network" + relative: true + source: path + version: "1.0.0" + ente_sharing: + dependency: "direct overridden" + description: + path: "../sharing" + relative: true + source: path + version: "1.0.0" ente_strings: dependency: "direct main" description: @@ -212,6 +242,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" ffi: dependency: transitive description: @@ -249,6 +287,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_animate: + dependency: "direct main" + description: + name: flutter_animate + sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" + url: "https://pub.dev" + source: hosted + version: "4.5.2" flutter_email_sender: dependency: transitive description: @@ -382,6 +428,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + flutter_shaders: + dependency: transitive + description: + name: flutter_shaders + sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" + url: "https://pub.dev" + source: hosted + version: "0.1.3" flutter_test: dependency: "direct dev" description: flutter @@ -440,6 +494,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + http_profile: + dependency: transitive + description: + name: http_profile + sha256: "7e679e355b09aaee2ab5010915c932cce3f2d1c11c3b2dc177891687014ffa78" + url: "https://pub.dev" + source: hosted + version: "0.1.0" intl: dependency: transitive description: @@ -448,6 +510,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" js: dependency: transitive description: @@ -544,6 +614,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + native_dio_adapter: + dependency: transitive + description: + name: native_dio_adapter + sha256: "1c51bd42027861d27ccad462ba0903f5e3197461cc6d59a0bb8658cb5ad7bd01" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "9f034ba1eeca53ddb339bc8f4813cb07336a849cd735559b60cdc068ecce2dc7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" package_info_plus: dependency: transitive description: @@ -648,6 +742,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" screen_retriever: dependency: transitive description: @@ -877,6 +979,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + ua_client_hints: + dependency: transitive + description: + name: ua_client_hints + sha256: "1b8759a46bfeab355252881df27f2604c01bded86aa2b578869fb1b638b23118" + url: "https://pub.dev" + source: hosted + version: "1.4.1" url_launcher: dependency: transitive description: @@ -973,6 +1083,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" win32: dependency: transitive description: diff --git a/mobile/packages/ui/pubspec.yaml b/mobile/packages/ui/pubspec.yaml index ce4ff14c20..bff75fe7f2 100644 --- a/mobile/packages/ui/pubspec.yaml +++ b/mobile/packages/ui/pubspec.yaml @@ -22,10 +22,11 @@ dependencies: expandable: ^5.0.1 flutter: sdk: flutter + flutter_animate: ^4.5.2 flutter_inappwebview: ^6.1.4 fluttertoast: ^8.1.1 modal_bottom_sheet: ^3.0.0 - shared_preferences: ^2.5.3 + shared_preferences: ^2.5.3 window_manager: ^0.5.0 dev_dependencies: From e8de5940fd676ca0480a085a12593c28b236eb4a Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:43:26 +0530 Subject: [PATCH 02/19] Update dependency overrides to include ente_network and ente_sharing --- mobile/packages/ui/pubspec_overrides.yaml | 6 +- mobile/packages/utils/pubspec.lock | 118 +++++++++++++++++++ mobile/packages/utils/pubspec.yaml | 2 + mobile/packages/utils/pubspec_overrides.yaml | 6 +- 4 files changed, 130 insertions(+), 2 deletions(-) diff --git a/mobile/packages/ui/pubspec_overrides.yaml b/mobile/packages/ui/pubspec_overrides.yaml index b7fe7eecb3..e98e3bd248 100644 --- a/mobile/packages/ui/pubspec_overrides.yaml +++ b/mobile/packages/ui/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_utils +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_utils,ente_network,ente_sharing dependency_overrides: ente_base: path: ../base @@ -8,6 +8,10 @@ dependency_overrides: path: ../events ente_logging: path: ../logging + ente_network: + path: ../network + ente_sharing: + path: ../sharing ente_strings: path: ../strings ente_utils: diff --git a/mobile/packages/utils/pubspec.lock b/mobile/packages/utils/pubspec.lock index b5eed28e27..4e7fd60f77 100644 --- a/mobile/packages/utils/pubspec.lock +++ b/mobile/packages/utils/pubspec.lock @@ -73,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + cronet_http: + dependency: transitive + description: + name: cronet_http + sha256: df26af0de7c4eff46c53c190b5590e22457bfce6ea679aedb1e6326197f27d6f + url: "https://pub.dev" + source: hosted + version: "1.4.0" cross_file: dependency: transitive description: @@ -97,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + cupertino_http: + dependency: transitive + description: + name: cupertino_http + sha256: "8fb9e2c36d0732d9d96abd76683406b57e78a2514e27c962e0c603dbe6f2e3f8" + url: "https://pub.dev" + source: hosted + version: "2.2.0" device_info_plus: dependency: transitive description: @@ -174,6 +190,20 @@ packages: relative: true source: path version: "1.0.0" + ente_network: + dependency: "direct overridden" + description: + path: "../network" + relative: true + source: path + version: "1.0.0" + ente_sharing: + dependency: "direct main" + description: + path: "../sharing" + relative: true + source: path + version: "1.0.0" ente_strings: dependency: "direct main" description: @@ -212,6 +242,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" ffi: dependency: transitive description: @@ -249,6 +287,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_animate: + dependency: transitive + description: + name: flutter_animate + sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" + url: "https://pub.dev" + source: hosted + version: "4.5.2" flutter_email_sender: dependency: "direct main" description: @@ -382,6 +428,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + flutter_shaders: + dependency: transitive + description: + name: flutter_shaders + sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" + url: "https://pub.dev" + source: hosted + version: "0.1.3" flutter_test: dependency: "direct dev" description: flutter @@ -440,6 +494,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + http_profile: + dependency: transitive + description: + name: http_profile + sha256: "7e679e355b09aaee2ab5010915c932cce3f2d1c11c3b2dc177891687014ffa78" + url: "https://pub.dev" + source: hosted + version: "0.1.0" intl: dependency: "direct main" description: @@ -448,6 +510,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.20.2" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" js: dependency: transitive description: @@ -544,6 +614,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + native_dio_adapter: + dependency: transitive + description: + name: native_dio_adapter + sha256: "1c51bd42027861d27ccad462ba0903f5e3197461cc6d59a0bb8658cb5ad7bd01" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "9f034ba1eeca53ddb339bc8f4813cb07336a849cd735559b60cdc068ecce2dc7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" package_info_plus: dependency: "direct main" description: @@ -648,6 +742,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" screen_retriever: dependency: transitive description: @@ -877,6 +979,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + ua_client_hints: + dependency: transitive + description: + name: ua_client_hints + sha256: "1b8759a46bfeab355252881df27f2604c01bded86aa2b578869fb1b638b23118" + url: "https://pub.dev" + source: hosted + version: "1.4.1" url_launcher: dependency: "direct main" description: @@ -973,6 +1083,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" win32: dependency: transitive description: diff --git a/mobile/packages/utils/pubspec.yaml b/mobile/packages/utils/pubspec.yaml index e208662108..85744d5176 100644 --- a/mobile/packages/utils/pubspec.yaml +++ b/mobile/packages/utils/pubspec.yaml @@ -14,6 +14,8 @@ dependencies: path: ../../packages/configuration ente_logging: path: ../../packages/logging + ente_sharing: + path: ../../packages/sharing ente_strings: path: ../../packages/strings ente_ui: diff --git a/mobile/packages/utils/pubspec_overrides.yaml b/mobile/packages/utils/pubspec_overrides.yaml index 666c854f83..07b1f14d2e 100644 --- a/mobile/packages/utils/pubspec_overrides.yaml +++ b/mobile/packages/utils/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_ui +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_ui,ente_network,ente_sharing dependency_overrides: ente_base: path: ../base @@ -8,6 +8,10 @@ dependency_overrides: path: ../events ente_logging: path: ../logging + ente_network: + path: ../network + ente_sharing: + path: ../sharing ente_strings: path: ../strings ente_ui: From b7dcb7b34cd9e5be40966079e979e05f6773790f Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:43:53 +0530 Subject: [PATCH 03/19] Add UserExtension to package --- .../utils/lib/extensions/user_extension.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mobile/packages/utils/lib/extensions/user_extension.dart diff --git a/mobile/packages/utils/lib/extensions/user_extension.dart b/mobile/packages/utils/lib/extensions/user_extension.dart new file mode 100644 index 0000000000..f48e46e3d4 --- /dev/null +++ b/mobile/packages/utils/lib/extensions/user_extension.dart @@ -0,0 +1,13 @@ + +import "package:ente_sharing/models/user.dart"; + +extension UserExtension on User { + //Some initial users have name in name field. + String? get displayName => + // ignore: deprecated_member_use_from_same_package, deprecated_member_use + ((name?.isEmpty ?? true) ? null : name); + + String get nameOrEmail { + return email.substring(0, email.indexOf("@")); + } +} From a142b660fd406a52c905c91e0500f6c167f0b6f3 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:44:17 +0530 Subject: [PATCH 04/19] Add golden color properties to EnteColorScheme --- mobile/packages/ui/lib/theme/colors.dart | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mobile/packages/ui/lib/theme/colors.dart b/mobile/packages/ui/lib/theme/colors.dart index 09123e109d..cecc222db7 100644 --- a/mobile/packages/ui/lib/theme/colors.dart +++ b/mobile/packages/ui/lib/theme/colors.dart @@ -161,6 +161,10 @@ class EnteColorScheme extends ThemeExtension { //other colors final List avatarColors; + //golden colors + final Color golden700; + final Color golden500; + bool get isLightTheme => backgroundBase == backgroundBaseLight; const EnteColorScheme( @@ -231,6 +235,8 @@ class EnteColorScheme extends ThemeExtension { this.codeCardBackgroundColor = _defaultCodeCardBackgroundColor, this.primaryColor = _defaultPrimaryColor, this.surface = _defaultPrimaryColor, + this.golden700 = _golden700, + this.golden500 = _golden500, }); /// Factory constructor for light theme with customizable primary colors @@ -776,6 +782,9 @@ const Color _defaultSearchResultsBackgroundColor = // Default Code Card Background Color const Color _defaultCodeCardBackgroundColor = Color.fromRGBO(246, 246, 246, 1); + +const Color _golden700 = Color(0xFFFDB816); +const Color _golden500 = Color(0xFFFFC336); /// Utility class to help apps create custom color schemes with their brand colors. /// /// This class provides convenient methods to generate complete color schemes @@ -899,7 +908,7 @@ const List avatarLight = [ Color.fromRGBO(50, 82, 136, 1), Color.fromRGBO(133, 180, 224, 1), Color.fromRGBO(193, 163, 163, 1), - Color.fromRGBO(225, 160, 89, 1), // Fixed duplicate + Color.fromRGBO(225, 160, 89, 1), // Fixed duplicate Color.fromRGBO(66, 97, 101, 1), Color.fromRGBO(107, 119, 178, 1), // Fixed duplicate Color.fromRGBO(149, 127, 239, 1), // Fixed duplicate From 9a13b99b2071019f13e6db07900fceed3a29be14 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:45:09 +0530 Subject: [PATCH 05/19] Extract strings --- .../strings/lib/l10n/arb/strings_en.arb | 48 +++++- .../lib/l10n/strings_localizations.dart | 150 ++++++++++++++++++ .../lib/l10n/strings_localizations_en.dart | 89 +++++++++++ 3 files changed, 285 insertions(+), 2 deletions(-) diff --git a/mobile/packages/strings/lib/l10n/arb/strings_en.arb b/mobile/packages/strings/lib/l10n/arb/strings_en.arb index 6db1039109..d91b891210 100644 --- a/mobile/packages/strings/lib/l10n/arb/strings_en.arb +++ b/mobile/packages/strings/lib/l10n/arb/strings_en.arb @@ -91,7 +91,6 @@ "@notAvailable": { "description": "Not available text" }, - "reportABug": "Report a bug", "@reportABug": { "description": "Label for reporting a bug" @@ -779,5 +778,50 @@ "endpointUpdatedMessage": "Endpoint updated successfully", "@endpointUpdatedMessage": { "description": "Success message when endpoint is updated" - } + }, + "yes": "Yes", + "remove": "Remove", + "addMore": "Add more", + "somethingWentWrong": "Something went wrong", + "legacy": "Legacy", + "recoveryWarning": "A trusted contact is trying to access your account", + "recoveryWarningBody": "{email} is trying to recover your account.", + "legacyPageDesc": "Legacy allows trusted contacts to access your account in your absence.", + "legacyPageDesc2": "Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.", + "legacyAccounts": "Legacy accounts", + "trustedContacts": "Trusted contacts", + "addTrustedContact": "Add Trusted Contact", + "removeInvite": "Remove invite", + "rejectRecovery": "Reject recovery", + "recoveryInitiated": "Recovery initiated", + "recoveryInitiatedDesc": "You can access the account after {days} days. A notification will be sent to {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "removeYourselfAsTrustedContact": "Remove yourself as trusted contact", + "declineTrustInvite": "Decline Invite", + "cancelAccountRecovery": "Cancel recovery", + "recoveryAccount": "Recover account", + "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", + "startAccountRecoveryTitle": "Start recovery", + "whyAddTrustContact": "Trusted contact can help in recovering your data.", + "recoveryReady": "You can now recover {email}'s account by setting a new password.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "trustedInviteBody": "You have been invited to be a legacy contact by {email}." } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations.dart b/mobile/packages/strings/lib/l10n/strings_localizations.dart index c0ec261268..ffb142a8e7 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations.dart @@ -1294,6 +1294,156 @@ abstract class StringsLocalizations { /// In en, this message translates to: /// **'Endpoint updated successfully'** String get endpointUpdatedMessage; + + /// No description provided for @yes. + /// + /// In en, this message translates to: + /// **'Yes'** + String get yes; + + /// No description provided for @remove. + /// + /// In en, this message translates to: + /// **'Remove'** + String get remove; + + /// No description provided for @addMore. + /// + /// In en, this message translates to: + /// **'Add more'** + String get addMore; + + /// No description provided for @somethingWentWrong. + /// + /// In en, this message translates to: + /// **'Something went wrong'** + String get somethingWentWrong; + + /// No description provided for @legacy. + /// + /// In en, this message translates to: + /// **'Legacy'** + String get legacy; + + /// No description provided for @recoveryWarning. + /// + /// In en, this message translates to: + /// **'A trusted contact is trying to access your account'** + String get recoveryWarning; + + /// No description provided for @recoveryWarningBody. + /// + /// In en, this message translates to: + /// **'{email} is trying to recover your account.'** + String recoveryWarningBody(Object email); + + /// No description provided for @legacyPageDesc. + /// + /// In en, this message translates to: + /// **'Legacy allows trusted contacts to access your account in your absence.'** + String get legacyPageDesc; + + /// No description provided for @legacyPageDesc2. + /// + /// In en, this message translates to: + /// **'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'** + String get legacyPageDesc2; + + /// No description provided for @legacyAccounts. + /// + /// In en, this message translates to: + /// **'Legacy accounts'** + String get legacyAccounts; + + /// No description provided for @trustedContacts. + /// + /// In en, this message translates to: + /// **'Trusted contacts'** + String get trustedContacts; + + /// No description provided for @addTrustedContact. + /// + /// In en, this message translates to: + /// **'Add Trusted Contact'** + String get addTrustedContact; + + /// No description provided for @removeInvite. + /// + /// In en, this message translates to: + /// **'Remove invite'** + String get removeInvite; + + /// No description provided for @rejectRecovery. + /// + /// In en, this message translates to: + /// **'Reject recovery'** + String get rejectRecovery; + + /// No description provided for @recoveryInitiated. + /// + /// In en, this message translates to: + /// **'Recovery initiated'** + String get recoveryInitiated; + + /// No description provided for @recoveryInitiatedDesc. + /// + /// In en, this message translates to: + /// **'You can access the account after {days} days. A notification will be sent to {email}.'** + String recoveryInitiatedDesc(int days, String email); + + /// No description provided for @removeYourselfAsTrustedContact. + /// + /// In en, this message translates to: + /// **'Remove yourself as trusted contact'** + String get removeYourselfAsTrustedContact; + + /// No description provided for @declineTrustInvite. + /// + /// In en, this message translates to: + /// **'Decline Invite'** + String get declineTrustInvite; + + /// No description provided for @cancelAccountRecovery. + /// + /// In en, this message translates to: + /// **'Cancel recovery'** + String get cancelAccountRecovery; + + /// No description provided for @recoveryAccount. + /// + /// In en, this message translates to: + /// **'Recover account'** + String get recoveryAccount; + + /// No description provided for @cancelAccountRecoveryBody. + /// + /// In en, this message translates to: + /// **'Are you sure you want to cancel recovery?'** + String get cancelAccountRecoveryBody; + + /// No description provided for @startAccountRecoveryTitle. + /// + /// In en, this message translates to: + /// **'Start recovery'** + String get startAccountRecoveryTitle; + + /// No description provided for @whyAddTrustContact. + /// + /// In en, this message translates to: + /// **'Trusted contact can help in recovering your data.'** + String get whyAddTrustContact; + + /// No description provided for @recoveryReady. + /// + /// In en, this message translates to: + /// **'You can now recover {email}\'s account by setting a new password.'** + String recoveryReady(String email); + + /// No description provided for @trustedInviteBody. + /// + /// In en, this message translates to: + /// **'You have been invited to be a legacy contact by {email}.'** + String trustedInviteBody(Object email); } class _StringsLocalizationsDelegate diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart index 37baaf6702..1b56ab38f8 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart @@ -623,4 +623,93 @@ class StringsLocalizationsEn extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } } From df522658bbcb8940a0839c69269284c032e06513 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:46:59 +0530 Subject: [PATCH 06/19] Move user_avator_widget to sharing package --- .../sharing/lib/user_avator_widget.dart | 223 +++++++++++++ mobile/packages/sharing/pubspec.lock | 310 +++++++++++++++++- mobile/packages/sharing/pubspec.yaml | 7 + .../packages/sharing/pubspec_overrides.yaml | 8 +- 4 files changed, 545 insertions(+), 3 deletions(-) create mode 100644 mobile/packages/sharing/lib/user_avator_widget.dart diff --git a/mobile/packages/sharing/lib/user_avator_widget.dart b/mobile/packages/sharing/lib/user_avator_widget.dart new file mode 100644 index 0000000000..ac3cdd915e --- /dev/null +++ b/mobile/packages/sharing/lib/user_avator_widget.dart @@ -0,0 +1,223 @@ +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_sharing/models/user.dart"; +import "package:ente_ui/theme/colors.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_utils/extensions/user_extension.dart"; +import 'package:flutter/material.dart'; +import 'package:tuple/tuple.dart'; + +enum AvatarType { small, mini, tiny, extra } + +class UserAvatarWidget extends StatefulWidget { + final User user; + final AvatarType type; + final int currentUserID; + final bool thumbnailView; + final BaseConfiguration config; + + const UserAvatarWidget( + this.user, { + super.key, + this.currentUserID = -1, + this.type = AvatarType.mini, + this.thumbnailView = false, + required this.config, + }); + + @override + State createState() => _UserAvatarWidgetState(); + static const strokeWidth = 1.0; +} + +class _UserAvatarWidgetState extends State { + @override + Widget build(BuildContext context) { + final double size = getAvatarSize(widget.type); + return Container( + padding: const EdgeInsets.all(0.5), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: widget.thumbnailView + ? strokeMutedDark + : getEnteColorScheme(context).strokeMuted, + width: UserAvatarWidget.strokeWidth, + strokeAlign: BorderSide.strokeAlignOutside, + ), + ), + child: SizedBox( + height: size, + width: size, + child: _FirstLetterCircularAvatar( + user: widget.user, + currentUserID: widget.currentUserID, + thumbnailView: widget.thumbnailView, + type: widget.type, + config: widget.config, + ), + ), + ); + } +} + +class _FirstLetterCircularAvatar extends StatefulWidget { + final User user; + final int currentUserID; + final bool thumbnailView; + final AvatarType type; + final BaseConfiguration config; + const _FirstLetterCircularAvatar({ + required this.user, + required this.currentUserID, + required this.thumbnailView, + required this.type, + required this.config, + }); + + @override + State<_FirstLetterCircularAvatar> createState() => + _FirstLetterCircularAvatarState(); +} + +class _FirstLetterCircularAvatarState + extends State<_FirstLetterCircularAvatar> { + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final displayChar = + (widget.user.displayName == null || widget.user.displayName!.isEmpty) + ? ((widget.user.email.isEmpty) + ? " " + : widget.user.email.substring(0, 1)) + : widget.user.displayName!.substring(0, 1); + Color decorationColor; + if ((widget.user.id != null && widget.user.id! < 0) || + widget.user.email == widget.config.getEmail()) { + decorationColor = Colors.black; + } else { + decorationColor = colorScheme.avatarColors[(widget.user.email.length) + .remainder(colorScheme.avatarColors.length)]; + } + + final avatarStyle = getAvatarStyle(context, widget.type); + final double size = avatarStyle.item1; + final TextStyle textStyle = avatarStyle.item2; + return Container( + padding: const EdgeInsets.all(0.5), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: widget.thumbnailView + ? strokeMutedDark + : getEnteColorScheme(context).strokeMuted, + width: UserAvatarWidget.strokeWidth, + strokeAlign: BorderSide.strokeAlignOutside, + ), + ), + child: SizedBox( + height: size, + width: size, + child: CircleAvatar( + backgroundColor: decorationColor, + child: Text( + displayChar.toUpperCase(), + // fixed color + style: textStyle.copyWith(color: Colors.white), + ), + ), + ), + ); + } + + Tuple2 getAvatarStyle( + BuildContext context, + AvatarType type, + ) { + final enteTextTheme = getEnteTextTheme(context); + switch (type) { + case AvatarType.small: + return Tuple2(32.0, enteTextTheme.small); + case AvatarType.mini: + return Tuple2(24.0, enteTextTheme.mini); + case AvatarType.tiny: + return Tuple2(18.0, enteTextTheme.tiny); + case AvatarType.extra: + return Tuple2(18.0, enteTextTheme.tiny); + } + } +} + +double getAvatarSize( + AvatarType type, +) { + switch (type) { + case AvatarType.small: + return 32.0; + case AvatarType.mini: + return 24.0; + case AvatarType.tiny: + return 18.0; + case AvatarType.extra: + return 18.0; + } +} + +class FirstLetterUserAvatar extends StatefulWidget { + final User user; + final BaseConfiguration config; + const FirstLetterUserAvatar( + this.user, { + super.key, + required this.config, + }); + + @override + State createState() => _FirstLetterUserAvatarState(); +} + +class _FirstLetterUserAvatarState extends State { + late String? currentUserEmail; + late User user; + + @override + void initState() { + super.initState(); + user = widget.user; + currentUserEmail = widget.config.getEmail(); + } + + @override + void didUpdateWidget(covariant FirstLetterUserAvatar oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.user != widget.user) { + setState(() { + user = widget.user; + }); + } + } + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final displayChar = (user.displayName == null || user.displayName!.isEmpty) + ? ((user.email.isEmpty) ? " " : user.email.substring(0, 1)) + : user.displayName!.substring(0, 1); + Color decorationColor; + if ((widget.user.id != null && widget.user.id! < 0) || + user.email == currentUserEmail) { + decorationColor = Colors.black; + } else { + decorationColor = colorScheme.avatarColors[ + (user.email.length).remainder(colorScheme.avatarColors.length)]; + } + return Container( + color: decorationColor, + child: Center( + child: Text( + displayChar.toUpperCase(), + style: getEnteTextTheme(context).small.copyWith(color: Colors.white), + ), + ), + ); + } +} diff --git a/mobile/packages/sharing/pubspec.lock b/mobile/packages/sharing/pubspec.lock index 0004f637a2..18564ad2c6 100644 --- a/mobile/packages/sharing/pubspec.lock +++ b/mobile/packages/sharing/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" args: dependency: transitive description: @@ -73,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -129,6 +145,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + email_validator: + dependency: transitive + description: + name: email_validator + sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb + url: "https://pub.dev" + source: hosted + version: "3.0.0" ente_base: dependency: "direct overridden" description: @@ -137,7 +161,7 @@ packages: source: path version: "1.0.0" ente_configuration: - dependency: "direct overridden" + dependency: "direct main" description: path: "../configuration" relative: true @@ -173,6 +197,27 @@ packages: relative: true source: path version: "1.0.0" + ente_strings: + dependency: "direct overridden" + description: + path: "../strings" + relative: true + source: path + version: "1.0.0" + ente_ui: + dependency: "direct main" + description: + path: "../ui" + relative: true + source: path + version: "1.0.0" + ente_utils: + dependency: "direct main" + description: + path: "../utils" + relative: true + source: path + version: "1.0.0" event_bus: dependency: transitive description: @@ -181,6 +226,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" + expandable: + dependency: transitive + description: + name: expandable + sha256: "9604d612d4d1146dafa96c6d8eec9c2ff0994658d6d09fed720ab788c7f5afc2" + url: "https://pub.dev" + source: hosted + version: "5.0.1" fake_async: dependency: transitive description: @@ -213,6 +266,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_saver: + dependency: transitive + description: + name: file_saver + sha256: "9d93db09bd4da9e43238f9dd485360fc51a5c138eea5ef5f407ec56e58079ac0" + url: "https://pub.dev" + source: hosted + version: "0.3.1" fixnum: dependency: transitive description: @@ -226,6 +287,86 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_animate: + dependency: transitive + description: + name: flutter_animate + sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" + url: "https://pub.dev" + source: hosted + version: "4.5.2" + flutter_email_sender: + dependency: transitive + description: + name: flutter_email_sender + sha256: d39eb5e91358fc19ec4050da69accec21f9d5b2b6bcf188aa246327b6ca2352c + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_inappwebview: + dependency: transitive + description: + name: flutter_inappwebview + sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" + url: "https://pub.dev" + source: hosted + version: "6.1.5" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" + url: "https://pub.dev" + source: hosted + version: "1.1.3" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 + url: "https://pub.dev" + source: hosted + version: "1.3.0+1" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_windows: + dependency: transitive + description: + name: flutter_inappwebview_windows + sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" + url: "https://pub.dev" + source: hosted + version: "0.6.0" flutter_lints: dependency: "direct dev" description: @@ -234,6 +375,11 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_secure_storage: dependency: transitive description: @@ -282,6 +428,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + flutter_shaders: + dependency: transitive + description: + name: flutter_shaders + sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" + url: "https://pub.dev" + source: hosted + version: "0.1.3" flutter_test: dependency: "direct dev" description: flutter @@ -292,6 +446,14 @@ packages: description: flutter source: sdk version: "0.0.0" + fluttertoast: + dependency: transitive + description: + name: fluttertoast + sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" + url: "https://pub.dev" + source: hosted + version: "8.2.12" freezed_annotation: dependency: transitive description: @@ -444,6 +606,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + modal_bottom_sheet: + dependency: transitive + description: + name: modal_bottom_sheet + sha256: eac66ef8cb0461bf069a38c5eb0fa728cee525a531a8304bd3f7b2185407c67e + url: "https://pub.dev" + source: hosted + version: "3.0.0" native_dio_adapter: dependency: transitive description: @@ -564,6 +734,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.9.1" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" pub_semver: dependency: transitive description: @@ -572,6 +750,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" sentry: dependency: transitive description: @@ -588,6 +806,22 @@ packages: url: "https://pub.dev" source: hosted version: "8.14.2" + share_plus: + dependency: transitive + description: + name: share_plus + sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 + url: "https://pub.dev" + source: hosted + version: "11.1.0" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.dev" + source: hosted + version: "6.1.0" shared_preferences: dependency: transitive description: @@ -730,7 +964,7 @@ packages: source: hosted version: "0.7.4" tuple: - dependency: transitive + dependency: "direct main" description: name: tuple sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 @@ -753,6 +987,70 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7" + url: "https://pub.dev" + source: hosted + version: "6.3.18" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + url: "https://pub.dev" + source: hosted + version: "6.3.4" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + url: "https://pub.dev" + source: hosted + version: "3.2.3" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" uuid: dependency: transitive description: @@ -809,6 +1107,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.5" + window_manager: + dependency: transitive + description: + name: window_manager + sha256: "7eb6d6c4164ec08e1bf978d6e733f3cebe792e2a23fb07cbca25c2872bfdbdcd" + url: "https://pub.dev" + source: hosted + version: "0.5.1" xdg_directories: dependency: transitive description: diff --git a/mobile/packages/sharing/pubspec.yaml b/mobile/packages/sharing/pubspec.yaml index 7f78e46272..33803ccae6 100644 --- a/mobile/packages/sharing/pubspec.yaml +++ b/mobile/packages/sharing/pubspec.yaml @@ -10,15 +10,22 @@ environment: dependencies: collection: ^1.17.0 dio: ^5.0.0 + ente_configuration: + path: ../configuration ente_crypto_dart: git: url: https://github.com/ente-io/ente_crypto_dart.git ente_network: path: ../network + ente_ui: + path: ../ui + ente_utils: + path: ../utils fast_base58: ^0.2.1 flutter: sdk: flutter logging: ^1.0.0 + tuple: ^2.0.2 dev_dependencies: flutter_lints: ^2.0.0 diff --git a/mobile/packages/sharing/pubspec_overrides.yaml b/mobile/packages/sharing/pubspec_overrides.yaml index 95002e716b..897783a63e 100644 --- a/mobile/packages/sharing/pubspec_overrides.yaml +++ b/mobile/packages/sharing/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils dependency_overrides: ente_base: path: ../base @@ -10,3 +10,9 @@ dependency_overrides: path: ../logging ente_network: path: ../network + ente_strings: + path: ../strings + ente_ui: + path: ../ui + ente_utils: + path: ../utils From b51febf8f5d2cd1ccb741d02ed0ff5fc0463e167 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Fri, 5 Sep 2025 23:48:32 +0530 Subject: [PATCH 07/19] Update dependencies --- mobile/apps/auth/pubspec.lock | 15 +++++++++++++++ mobile/apps/auth/pubspec_overrides.yaml | 4 +++- mobile/packages/lock_screen/pubspec.lock | 15 +++++++++++++++ .../packages/lock_screen/pubspec_overrides.yaml | 4 +++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/mobile/apps/auth/pubspec.lock b/mobile/apps/auth/pubspec.lock index 1005b6f6ed..f5d678f09d 100644 --- a/mobile/apps/auth/pubspec.lock +++ b/mobile/apps/auth/pubspec.lock @@ -458,6 +458,13 @@ packages: relative: true source: path version: "0.0.1" + ente_sharing: + dependency: "direct overridden" + description: + path: "../../packages/sharing" + relative: true + source: path + version: "1.0.0" ente_strings: dependency: "direct main" description: @@ -511,6 +518,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" ffi: dependency: "direct main" description: diff --git a/mobile/apps/auth/pubspec_overrides.yaml b/mobile/apps/auth/pubspec_overrides.yaml index 53839bf8d8..5c1cd4757e 100644 --- a/mobile/apps/auth/pubspec_overrides.yaml +++ b/mobile/apps/auth/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils +# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_sharing dependency_overrides: ente_accounts: path: ../../packages/accounts @@ -14,6 +14,8 @@ dependency_overrides: path: ../../packages/logging ente_network: path: ../../packages/network + ente_sharing: + path: ../../packages/sharing ente_strings: path: ../../packages/strings ente_ui: diff --git a/mobile/packages/lock_screen/pubspec.lock b/mobile/packages/lock_screen/pubspec.lock index 9c322f7f7c..bcd133b0f2 100644 --- a/mobile/packages/lock_screen/pubspec.lock +++ b/mobile/packages/lock_screen/pubspec.lock @@ -244,6 +244,13 @@ packages: relative: true source: path version: "1.0.0" + ente_sharing: + dependency: "direct overridden" + description: + path: "../sharing" + relative: true + source: path + version: "1.0.0" ente_strings: dependency: "direct main" description: @@ -289,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" ffi: dependency: transitive description: diff --git a/mobile/packages/lock_screen/pubspec_overrides.yaml b/mobile/packages/lock_screen/pubspec_overrides.yaml index 0657d5dedc..adaf5acfc4 100644 --- a/mobile/packages/lock_screen/pubspec_overrides.yaml +++ b/mobile/packages/lock_screen/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils +# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_sharing dependency_overrides: ente_accounts: path: ../accounts @@ -12,6 +12,8 @@ dependency_overrides: path: ../logging ente_network: path: ../network + ente_sharing: + path: ../sharing ente_strings: path: ../strings ente_ui: From 8eaa2603ddb8d9a0bb027a66b68005302a4f7153 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 05:43:37 +0530 Subject: [PATCH 08/19] Add VerifyIdentifyDialog widget to sharing package --- .../sharing/lib/verify_identity_dialog.dart | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 mobile/packages/sharing/lib/verify_identity_dialog.dart diff --git a/mobile/packages/sharing/lib/verify_identity_dialog.dart b/mobile/packages/sharing/lib/verify_identity_dialog.dart new file mode 100644 index 0000000000..6e0a0448be --- /dev/null +++ b/mobile/packages/sharing/lib/verify_identity_dialog.dart @@ -0,0 +1,211 @@ +import "dart:convert"; + +import 'package:bip39/bip39.dart' as bip39; +import "package:crypto/crypto.dart"; +import "package:dotted_border/dotted_border.dart"; +import "package:ente_accounts/services/user_service.dart"; +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/buttons/button_widget.dart"; +import "package:ente_ui/components/buttons/models/button_type.dart"; +import "package:ente_ui/components/loading_widget.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_utils/share_utils.dart"; +import "package:flutter/material.dart"; +import "package:flutter/services.dart"; +import "package:logging/logging.dart"; + +class VerifyIdentifyDialog extends StatefulWidget { + // email id of the user who's verification ID is being displayed for + // verification + final String email; + + // self is true when the user is viewing their own verification ID + final bool self; + final BaseConfiguration config; + + VerifyIdentifyDialog({ + super.key, + required this.self, + this.email = '', + required this.config, + }) { + if (!self && email.isEmpty) { + throw ArgumentError("email cannot be empty when self is false"); + } + } + + @override + State createState() => _VerifyIdentifyDialogState(); +} + +class _VerifyIdentifyDialogState extends State { + final bool doesUserExist = true; + + @override + Widget build(BuildContext context) { + final textStyle = getEnteTextTheme(context); + final String subTitle = widget.self + ? context.strings.thisIsYourVerificationId + : context.strings.thisIsPersonVerificationId(widget.email); + final String bottomText = widget.self + ? context.strings.someoneSharingAlbumsWithYouShouldSeeTheSameId + : context.strings.howToViewShareeVerificationID; + + final AlertDialog alert = AlertDialog( + title: Text( + widget.self + ? context.strings.verificationId + : context.strings.verifyEmailID(widget.email), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + FutureBuilder( + future: _getPublicKey(), + builder: (context, snapshot) { + if (snapshot.hasData) { + final publicKey = snapshot.data!; + if (publicKey.isEmpty) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.strings.emailNoEnteAccount(widget.email), + ), + const SizedBox(height: 24), + ButtonWidget( + buttonType: ButtonType.neutral, + icon: Icons.adaptive.share, + labelText: context.strings.sendInvite, + isInAlert: true, + onTap: () async { + // ignore: unawaited_futures + shareText( + context.strings.shareTextRecommendUsingEnte, + ); + }, + ), + ], + ); + } else { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + subTitle, + style: textStyle.bodyMuted, + ), + const SizedBox(height: 20), + _verificationIDWidget(context, publicKey), + const SizedBox(height: 16), + Text( + bottomText, + style: textStyle.bodyMuted, + ), + const SizedBox(height: 24), + ButtonWidget( + buttonType: ButtonType.neutral, + isInAlert: true, + labelText: widget.self + ? context.strings.ok + : context.strings.done, + ), + ], + ); + } + } else if (snapshot.hasError) { + Logger("VerificationID") + .severe("failed to end userID", snapshot.error); + return Text( + context.strings.somethingWentWrong, + style: textStyle.bodyMuted, + ); + } else { + return const SizedBox( + height: 200, + child: EnteLoadingWidget(), + ); + } + }, + ), + ], + ), + ); + return alert; + } + + Future _getPublicKey() async { + if (widget.self) { + return widget.config.getKeyAttributes()!.publicKey; + } + final String? userPublicKey = + await UserService.instance.getPublicKey(widget.email); + if (userPublicKey == null) { + // user not found + return ""; + } + return userPublicKey; + } + + Widget _verificationIDWidget(BuildContext context, String publicKey) { + final colorScheme = getEnteColorScheme(context); + final textStyle = getEnteTextTheme(context); + final String verificationID = _generateVerificationID(publicKey); + return DottedBorder( + options: RoundedRectDottedBorderOptions( + color: colorScheme.strokeMuted, + strokeWidth: 1, + dashPattern: const [12, 6], + radius: const Radius.circular(8), + ), + child: Column( + children: [ + GestureDetector( + onTap: () async { + if (verificationID.isEmpty) { + return; + } + await Clipboard.setData( + ClipboardData(text: verificationID), + ); + // ignore: unawaited_futures + shareText( + widget.self + ? context.strings.shareMyVerificationID(verificationID) + : context.strings + .shareTextConfirmOthersVerificationID(verificationID), + ); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(2), + ), + color: colorScheme.backgroundElevated2, + ), + padding: const EdgeInsets.all(20), + width: double.infinity, + child: Text( + verificationID, + style: textStyle.bodyBold, + ), + ), + ), + ], + ), + ); + } + + String _generateVerificationID(String publicKey) { + final inputBytes = base64.decode(publicKey); + final shaValue = sha256.convert(inputBytes); + return bip39.generateMnemonic( + strength: 256, + randomBytes: (int size) { + return Uint8List.fromList(shaValue.bytes); + }, + ); + } +} From a3b432799af493207a66c91419561072521c616e Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 05:45:12 +0530 Subject: [PATCH 09/19] Update dependencies --- mobile/packages/accounts/pubspec.lock | 15 ++ .../packages/accounts/pubspec_overrides.yaml | 4 +- mobile/packages/sharing/pubspec.lock | 181 +++++++++++++++++- mobile/packages/sharing/pubspec.yaml | 7 + .../packages/sharing/pubspec_overrides.yaml | 6 +- mobile/packages/ui/pubspec.lock | 175 +++++++++++++++++ mobile/packages/ui/pubspec_overrides.yaml | 6 +- mobile/packages/utils/pubspec.lock | 179 ++++++++++++++++- mobile/packages/utils/pubspec_overrides.yaml | 6 +- 9 files changed, 570 insertions(+), 9 deletions(-) diff --git a/mobile/packages/accounts/pubspec.lock b/mobile/packages/accounts/pubspec.lock index 498b45bfa4..56e60f94c6 100644 --- a/mobile/packages/accounts/pubspec.lock +++ b/mobile/packages/accounts/pubspec.lock @@ -244,6 +244,13 @@ packages: relative: true source: path version: "1.0.0" + ente_sharing: + dependency: "direct overridden" + description: + path: "../sharing" + relative: true + source: path + version: "1.0.0" ente_strings: dependency: "direct main" description: @@ -289,6 +296,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" ffi: dependency: transitive description: diff --git a/mobile/packages/accounts/pubspec_overrides.yaml b/mobile/packages/accounts/pubspec_overrides.yaml index d56ef125a6..7bc5fb67af 100644 --- a/mobile/packages/accounts/pubspec_overrides.yaml +++ b/mobile/packages/accounts/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_sharing dependency_overrides: ente_base: path: ../base @@ -12,6 +12,8 @@ dependency_overrides: path: ../logging ente_network: path: ../network + ente_sharing: + path: ../sharing ente_strings: path: ../strings ente_ui: diff --git a/mobile/packages/sharing/pubspec.lock b/mobile/packages/sharing/pubspec.lock index 18564ad2c6..f9324dd686 100644 --- a/mobile/packages/sharing/pubspec.lock +++ b/mobile/packages/sharing/pubspec.lock @@ -1,6 +1,38 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" archive: dependency: transitive description: @@ -26,7 +58,7 @@ packages: source: hosted version: "2.13.0" bip39: - dependency: transitive + dependency: "direct main" description: name: bip39 sha256: de1ee27ebe7d96b84bb3a04a4132a0a3007dcdd5ad27dd14aa87a29d97c45edc @@ -90,7 +122,7 @@ packages: source: hosted version: "0.3.4+2" crypto: - dependency: transitive + dependency: "direct main" description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" @@ -145,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + dotted_border: + dependency: "direct main" + description: + name: dotted_border + sha256: "99b091ec6891ba0c5331fdc2b502993c7c108f898995739a73c6845d71dad70c" + url: "https://pub.dev" + source: hosted + version: "3.1.0" email_validator: dependency: transitive description: @@ -153,6 +193,13 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + ente_accounts: + dependency: "direct main" + description: + path: "../accounts" + relative: true + source: path + version: "1.0.0" ente_base: dependency: "direct overridden" description: @@ -183,6 +230,13 @@ packages: relative: true source: path version: "1.0.0" + ente_lock_screen: + dependency: "direct overridden" + description: + path: "../lock_screen" + relative: true + source: path + version: "1.0.0" ente_logging: dependency: "direct overridden" description: @@ -198,7 +252,7 @@ packages: source: path version: "1.0.0" ente_strings: - dependency: "direct overridden" + dependency: "direct main" description: path: "../strings" relative: true @@ -375,11 +429,28 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + flutter_local_authentication: + dependency: transitive + description: + path: "." + ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + resolved-ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + url: "https://github.com/eaceto/flutter_local_authentication" + source: git + version: "1.2.0" flutter_localizations: dependency: transitive description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + url: "https://pub.dev" + source: hosted + version: "2.0.30" flutter_secure_storage: dependency: transitive description: @@ -462,6 +533,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" hex: dependency: transitive description: @@ -566,6 +645,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + local_auth: + dependency: transitive + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + url: "https://pub.dev" + source: hosted + version: "1.0.52" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" logging: dependency: "direct main" description: @@ -654,6 +773,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.1" + password_strength: + dependency: transitive + description: + name: password_strength + sha256: "0e51e3d864e37873a1347e658147f88b66e141ee36c58e19828dc5637961e1ce" + url: "https://pub.dev" + source: hosted + version: "0.2.0" path: dependency: transitive description: @@ -710,6 +837,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + pinput: + dependency: transitive + description: + name: pinput + sha256: c41f42ee301505ae2375ec32871c985d3717bf8aee845620465b286e0140aad2 + url: "https://pub.dev" + source: hosted + version: "5.0.2" platform: dependency: transitive description: @@ -742,6 +877,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + privacy_screen: + dependency: transitive + description: + name: privacy_screen + sha256: "2856e3a3ed082061a5cd2a1518f1ce6367c55916fb75e5db72e5983033a1ca54" + url: "https://pub.dev" + source: hosted + version: "0.0.8" pub_semver: dependency: transitive description: @@ -923,6 +1066,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.1" + step_progress_indicator: + dependency: transitive + description: + name: step_progress_indicator + sha256: b51bb1fcfc78454359f0658c5a2c21548c3825ebf76e826308e9ca10f383bbb8 + url: "https://pub.dev" + source: hosted + version: "1.0.2" stream_channel: dependency: transitive description: @@ -939,6 +1090,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + styled_text: + dependency: transitive + description: + name: styled_text + sha256: fd624172cf629751b4f171dd0ecf9acf02a06df3f8a81bb56c0caa4f1df706c3 + url: "https://pub.dev" + source: hosted + version: "8.1.0" synchronized: dependency: transitive description: @@ -987,6 +1146,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" url_launcher: dependency: transitive description: @@ -1123,6 +1290,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xmlstream: + dependency: transitive + description: + name: xmlstream + sha256: cfc14e3f256997897df9481ae630d94c2d85ada5187ebeb868bb1aabc2c977b4 + url: "https://pub.dev" + source: hosted + version: "1.1.1" sdks: dart: ">=3.8.0 <4.0.0" flutter: ">=3.29.0" diff --git a/mobile/packages/sharing/pubspec.yaml b/mobile/packages/sharing/pubspec.yaml index 33803ccae6..5e46e092dc 100644 --- a/mobile/packages/sharing/pubspec.yaml +++ b/mobile/packages/sharing/pubspec.yaml @@ -8,8 +8,13 @@ environment: flutter: ">=3.10.0" dependencies: + bip39: ^1.0.6 collection: ^1.17.0 + crypto: ^3.0.6 dio: ^5.0.0 + dotted_border: ^3.1.0 + ente_accounts: + path: ../accounts ente_configuration: path: ../configuration ente_crypto_dart: @@ -17,6 +22,8 @@ dependencies: url: https://github.com/ente-io/ente_crypto_dart.git ente_network: path: ../network + ente_strings: + path: ../strings ente_ui: path: ../ui ente_utils: diff --git a/mobile/packages/sharing/pubspec_overrides.yaml b/mobile/packages/sharing/pubspec_overrides.yaml index 897783a63e..f2f9b89599 100644 --- a/mobile/packages/sharing/pubspec_overrides.yaml +++ b/mobile/packages/sharing/pubspec_overrides.yaml @@ -1,11 +1,15 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_accounts,ente_lock_screen dependency_overrides: + ente_accounts: + path: ../accounts ente_base: path: ../base ente_configuration: path: ../configuration ente_events: path: ../events + ente_lock_screen: + path: ../lock_screen ente_logging: path: ../logging ente_network: diff --git a/mobile/packages/ui/pubspec.lock b/mobile/packages/ui/pubspec.lock index f76049e6c2..991b14cccd 100644 --- a/mobile/packages/ui/pubspec.lock +++ b/mobile/packages/ui/pubspec.lock @@ -1,6 +1,38 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" archive: dependency: transitive description: @@ -145,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + dotted_border: + dependency: transitive + description: + name: dotted_border + sha256: "99b091ec6891ba0c5331fdc2b502993c7c108f898995739a73c6845d71dad70c" + url: "https://pub.dev" + source: hosted + version: "3.1.0" email_validator: dependency: transitive description: @@ -153,6 +193,13 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + ente_accounts: + dependency: "direct overridden" + description: + path: "../accounts" + relative: true + source: path + version: "1.0.0" ente_base: dependency: "direct main" description: @@ -183,6 +230,13 @@ packages: relative: true source: path version: "1.0.0" + ente_lock_screen: + dependency: "direct overridden" + description: + path: "../lock_screen" + relative: true + source: path + version: "1.0.0" ente_logging: dependency: "direct main" description: @@ -375,11 +429,28 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_local_authentication: + dependency: transitive + description: + path: "." + ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + resolved-ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + url: "https://github.com/eaceto/flutter_local_authentication" + source: git + version: "1.2.0" flutter_localizations: dependency: transitive description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + url: "https://pub.dev" + source: hosted + version: "2.0.30" flutter_secure_storage: dependency: transitive description: @@ -462,6 +533,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" hex: dependency: transitive description: @@ -566,6 +645,46 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + local_auth: + dependency: transitive + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + url: "https://pub.dev" + source: hosted + version: "1.0.52" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" logging: dependency: transitive description: @@ -654,6 +773,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.1" + password_strength: + dependency: transitive + description: + name: password_strength + sha256: "0e51e3d864e37873a1347e658147f88b66e141ee36c58e19828dc5637961e1ce" + url: "https://pub.dev" + source: hosted + version: "0.2.0" path: dependency: transitive description: @@ -710,6 +837,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + pinput: + dependency: transitive + description: + name: pinput + sha256: c41f42ee301505ae2375ec32871c985d3717bf8aee845620465b286e0140aad2 + url: "https://pub.dev" + source: hosted + version: "5.0.2" platform: dependency: transitive description: @@ -742,6 +877,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + privacy_screen: + dependency: transitive + description: + name: privacy_screen + sha256: "2856e3a3ed082061a5cd2a1518f1ce6367c55916fb75e5db72e5983033a1ca54" + url: "https://pub.dev" + source: hosted + version: "0.0.8" pub_semver: dependency: transitive description: @@ -923,6 +1066,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.1" + step_progress_indicator: + dependency: transitive + description: + name: step_progress_indicator + sha256: b51bb1fcfc78454359f0658c5a2c21548c3825ebf76e826308e9ca10f383bbb8 + url: "https://pub.dev" + source: hosted + version: "1.0.2" stream_channel: dependency: transitive description: @@ -939,6 +1090,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + styled_text: + dependency: transitive + description: + name: styled_text + sha256: fd624172cf629751b4f171dd0ecf9acf02a06df3f8a81bb56c0caa4f1df706c3 + url: "https://pub.dev" + source: hosted + version: "8.1.0" synchronized: dependency: transitive description: @@ -987,6 +1146,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" url_launcher: dependency: transitive description: @@ -1123,6 +1290,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xmlstream: + dependency: transitive + description: + name: xmlstream + sha256: cfc14e3f256997897df9481ae630d94c2d85ada5187ebeb868bb1aabc2c977b4 + url: "https://pub.dev" + source: hosted + version: "1.1.1" sdks: dart: ">=3.8.0 <4.0.0" flutter: ">=3.29.0" diff --git a/mobile/packages/ui/pubspec_overrides.yaml b/mobile/packages/ui/pubspec_overrides.yaml index e98e3bd248..78942f59db 100644 --- a/mobile/packages/ui/pubspec_overrides.yaml +++ b/mobile/packages/ui/pubspec_overrides.yaml @@ -1,11 +1,15 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_utils,ente_network,ente_sharing +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_utils,ente_network,ente_sharing,ente_accounts,ente_lock_screen dependency_overrides: + ente_accounts: + path: ../accounts ente_base: path: ../base ente_configuration: path: ../configuration ente_events: path: ../events + ente_lock_screen: + path: ../lock_screen ente_logging: path: ../logging ente_network: diff --git a/mobile/packages/utils/pubspec.lock b/mobile/packages/utils/pubspec.lock index 4e7fd60f77..93f130144a 100644 --- a/mobile/packages/utils/pubspec.lock +++ b/mobile/packages/utils/pubspec.lock @@ -1,6 +1,38 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" archive: dependency: "direct main" description: @@ -145,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + dotted_border: + dependency: transitive + description: + name: dotted_border + sha256: "99b091ec6891ba0c5331fdc2b502993c7c108f898995739a73c6845d71dad70c" + url: "https://pub.dev" + source: hosted + version: "3.1.0" email_validator: dependency: "direct main" description: @@ -153,6 +193,13 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.0" + ente_accounts: + dependency: "direct overridden" + description: + path: "../accounts" + relative: true + source: path + version: "1.0.0" ente_base: dependency: "direct overridden" description: @@ -183,6 +230,13 @@ packages: relative: true source: path version: "1.0.0" + ente_lock_screen: + dependency: "direct overridden" + description: + path: "../lock_screen" + relative: true + source: path + version: "1.0.0" ente_logging: dependency: "direct main" description: @@ -375,11 +429,28 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_local_authentication: + dependency: transitive + description: + path: "." + ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + resolved-ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + url: "https://github.com/eaceto/flutter_local_authentication" + source: git + version: "1.2.0" flutter_localizations: dependency: transitive description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + url: "https://pub.dev" + source: hosted + version: "2.0.30" flutter_secure_storage: dependency: transitive description: @@ -462,6 +533,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.4" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" hex: dependency: transitive description: @@ -566,6 +645,46 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + local_auth: + dependency: transitive + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + url: "https://pub.dev" + source: hosted + version: "1.0.52" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" logging: dependency: "direct main" description: @@ -654,6 +773,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + password_strength: + dependency: transitive + description: + name: password_strength + sha256: "0e51e3d864e37873a1347e658147f88b66e141ee36c58e19828dc5637961e1ce" + url: "https://pub.dev" + source: hosted + version: "0.2.0" path: dependency: "direct main" description: @@ -710,6 +837,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + pinput: + dependency: transitive + description: + name: pinput + sha256: c41f42ee301505ae2375ec32871c985d3717bf8aee845620465b286e0140aad2 + url: "https://pub.dev" + source: hosted + version: "5.0.2" platform: dependency: transitive description: @@ -742,6 +877,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.3" + privacy_screen: + dependency: transitive + description: + name: privacy_screen + sha256: "2856e3a3ed082061a5cd2a1518f1ce6367c55916fb75e5db72e5983033a1ca54" + url: "https://pub.dev" + source: hosted + version: "0.0.8" pub_semver: dependency: transitive description: @@ -923,6 +1066,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.1" + step_progress_indicator: + dependency: transitive + description: + name: step_progress_indicator + sha256: b51bb1fcfc78454359f0658c5a2c21548c3825ebf76e826308e9ca10f383bbb8 + url: "https://pub.dev" + source: hosted + version: "1.0.2" stream_channel: dependency: transitive description: @@ -939,6 +1090,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + styled_text: + dependency: transitive + description: + name: styled_text + sha256: fd624172cf629751b4f171dd0ecf9acf02a06df3f8a81bb56c0caa4f1df706c3 + url: "https://pub.dev" + source: hosted + version: "8.1.0" synchronized: dependency: transitive description: @@ -987,6 +1146,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" url_launcher: dependency: "direct main" description: @@ -1123,6 +1290,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xmlstream: + dependency: transitive + description: + name: xmlstream + sha256: cfc14e3f256997897df9481ae630d94c2d85ada5187ebeb868bb1aabc2c977b4 + url: "https://pub.dev" + source: hosted + version: "1.1.1" sdks: - dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.7.2 <4.0.0" + flutter: ">=3.29.0" diff --git a/mobile/packages/utils/pubspec_overrides.yaml b/mobile/packages/utils/pubspec_overrides.yaml index 07b1f14d2e..4d1ec0b2e4 100644 --- a/mobile/packages/utils/pubspec_overrides.yaml +++ b/mobile/packages/utils/pubspec_overrides.yaml @@ -1,11 +1,15 @@ -# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_ui,ente_network,ente_sharing +# melos_managed_dependency_overrides: ente_base,ente_configuration,ente_events,ente_logging,ente_strings,ente_ui,ente_network,ente_sharing,ente_accounts,ente_lock_screen dependency_overrides: + ente_accounts: + path: ../accounts ente_base: path: ../base ente_configuration: path: ../configuration ente_events: path: ../events + ente_lock_screen: + path: ../lock_screen ente_logging: path: ../logging ente_network: From 678b556f5f37404c6137839b0e24efb5977cc096 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 05:51:30 +0530 Subject: [PATCH 10/19] Refactor sharing components: move UserAvatarWidget and VerifyIdentityDialog to ente_sharing package, update imports, and adjust configurations --- .../lib/ui/sharing/add_participant_page.dart | 9 +- .../ui/sharing/album_participants_page.dart | 5 +- .../ui/sharing/album_share_info_widget.dart | 4 +- .../lib/ui/sharing/share_collection_page.dart | 6 +- .../lib/ui/sharing/user_avator_widget.dart | 212 ------------------ .../ui/sharing/verify_identity_dialog.dart | 208 ----------------- .../sharing/lib/verify_identity_dialog.dart | 8 +- 7 files changed, 21 insertions(+), 431 deletions(-) delete mode 100644 mobile/apps/locker/lib/ui/sharing/user_avator_widget.dart delete mode 100644 mobile/apps/locker/lib/ui/sharing/verify_identity_dialog.dart diff --git a/mobile/apps/locker/lib/ui/sharing/add_participant_page.dart b/mobile/apps/locker/lib/ui/sharing/add_participant_page.dart index 2149bd4296..f9a3bf5812 100644 --- a/mobile/apps/locker/lib/ui/sharing/add_participant_page.dart +++ b/mobile/apps/locker/lib/ui/sharing/add_participant_page.dart @@ -1,5 +1,7 @@ import 'package:email_validator/email_validator.dart'; import "package:ente_sharing/models/user.dart"; +import "package:ente_sharing/user_avator_widget.dart"; +import "package:ente_sharing/verify_identity_dialog.dart"; import "package:ente_ui/components/buttons/button_widget.dart"; import "package:ente_ui/components/buttons/models/button_type.dart"; import "package:ente_ui/components/captioned_text_widget.dart"; @@ -15,8 +17,7 @@ import "package:locker/extensions/user_extension.dart"; import "package:locker/l10n/l10n.dart"; import "package:locker/services/collections/collections_service.dart"; import "package:locker/services/collections/models/collection.dart"; -import "package:locker/ui/sharing/user_avator_widget.dart"; -import "package:locker/ui/sharing/verify_identity_dialog.dart"; +import "package:locker/services/configuration.dart"; import "package:locker/utils/collection_actions.dart"; enum ActionTypesToShow { @@ -162,6 +163,7 @@ class _AddParticipantPage extends State { leadingIconWidget: UserAvatarWidget( currentUser, type: AvatarType.mini, + config: Configuration.instance, ), menuItemColor: getEnteColorScheme(context).fillFaint, @@ -188,9 +190,10 @@ class _AddParticipantPage extends State { useRootNavigator: false, context: context, builder: (BuildContext context) { - return VerifyIdentifyDialog( + return VerifyIdentityDialog( self: false, email: currentUser.email, + config: Configuration.instance, ); }, ); diff --git a/mobile/apps/locker/lib/ui/sharing/album_participants_page.dart b/mobile/apps/locker/lib/ui/sharing/album_participants_page.dart index bfe88cf813..747560a089 100644 --- a/mobile/apps/locker/lib/ui/sharing/album_participants_page.dart +++ b/mobile/apps/locker/lib/ui/sharing/album_participants_page.dart @@ -1,4 +1,5 @@ import "package:ente_sharing/models/user.dart"; +import "package:ente_sharing/user_avator_widget.dart"; import "package:ente_ui/components/captioned_text_widget.dart"; import "package:ente_ui/components/divider_widget.dart"; import "package:ente_ui/components/menu_item_widget.dart"; @@ -14,7 +15,6 @@ import "package:locker/services/collections/models/collection.dart"; import "package:locker/services/configuration.dart"; import "package:locker/ui/sharing/add_participant_page.dart"; import "package:locker/ui/sharing/manage_album_participant.dart"; -import "package:locker/ui/sharing/user_avator_widget.dart"; class AlbumParticipantsPage extends StatefulWidget { final Collection collection; @@ -119,6 +119,7 @@ class _AlbumParticipantsPageState extends State { leadingIconWidget: UserAvatarWidget( owner, currentUserID: currentUserID, + config: Configuration.instance, ), leadingIconSize: 24, menuItemColor: colorScheme.fillFaint, @@ -165,6 +166,7 @@ class _AlbumParticipantsPageState extends State { currentUser, type: AvatarType.mini, currentUserID: currentUserID, + config: Configuration.instance, ), menuItemColor: getEnteColorScheme(context).fillFaint, trailingIcon: isOwner ? Icons.chevron_right : null, @@ -243,6 +245,7 @@ class _AlbumParticipantsPageState extends State { currentUser, type: AvatarType.mini, currentUserID: currentUserID, + config: Configuration.instance, ), menuItemColor: getEnteColorScheme(context).fillFaint, trailingIcon: isOwner ? Icons.chevron_right : null, diff --git a/mobile/apps/locker/lib/ui/sharing/album_share_info_widget.dart b/mobile/apps/locker/lib/ui/sharing/album_share_info_widget.dart index a0fbf911c0..b67ddba111 100644 --- a/mobile/apps/locker/lib/ui/sharing/album_share_info_widget.dart +++ b/mobile/apps/locker/lib/ui/sharing/album_share_info_widget.dart @@ -1,9 +1,10 @@ import "dart:math"; import "package:ente_sharing/models/user.dart"; +import "package:ente_sharing/user_avator_widget.dart"; import "package:flutter/material.dart"; +import "package:locker/services/configuration.dart"; import "package:locker/ui/sharing/more_count_badge.dart"; -import "package:locker/ui/sharing/user_avator_widget.dart"; class AlbumSharesIcons extends StatelessWidget { final List sharees; @@ -38,6 +39,7 @@ class AlbumSharesIcons extends StatelessWidget { sharees[index], thumbnailView: removeBorder, type: type, + config: Configuration.instance, ), ), ); diff --git a/mobile/apps/locker/lib/ui/sharing/share_collection_page.dart b/mobile/apps/locker/lib/ui/sharing/share_collection_page.dart index f40553ef6c..1b6148a358 100644 --- a/mobile/apps/locker/lib/ui/sharing/share_collection_page.dart +++ b/mobile/apps/locker/lib/ui/sharing/share_collection_page.dart @@ -1,4 +1,5 @@ import "package:ente_sharing/models/user.dart"; +import "package:ente_sharing/user_avator_widget.dart"; import "package:ente_ui/components/captioned_text_widget.dart"; import "package:ente_ui/components/divider_widget.dart"; import "package:ente_ui/components/menu_item_widget.dart"; @@ -13,13 +14,13 @@ import "package:flutter/services.dart"; import "package:locker/extensions/user_extension.dart"; import "package:locker/l10n/l10n.dart"; import "package:locker/services/collections/collections_service.dart"; -import "package:locker/services/collections/models/collection.dart"; +import "package:locker/services/collections/models/collection.dart"; +import "package:locker/services/configuration.dart"; import "package:locker/ui/sharing/add_participant_page.dart"; import "package:locker/ui/sharing/album_participants_page.dart"; import "package:locker/ui/sharing/album_share_info_widget.dart"; import "package:locker/ui/sharing/manage_album_participant.dart"; import "package:locker/ui/sharing/manage_links_widget.dart"; -import "package:locker/ui/sharing/user_avator_widget.dart"; import "package:locker/utils/collection_actions.dart"; class ShareCollectionPage extends StatefulWidget { @@ -341,6 +342,7 @@ class EmailItemWidget extends StatelessWidget { leadingIconWidget: UserAvatarWidget( collection.getSharees().first, thumbnailView: false, + config: Configuration.instance, ), leadingIconSize: 24, menuItemColor: getEnteColorScheme(context).fillFaint, diff --git a/mobile/apps/locker/lib/ui/sharing/user_avator_widget.dart b/mobile/apps/locker/lib/ui/sharing/user_avator_widget.dart deleted file mode 100644 index 5ce26e230b..0000000000 --- a/mobile/apps/locker/lib/ui/sharing/user_avator_widget.dart +++ /dev/null @@ -1,212 +0,0 @@ - -import "package:ente_sharing/models/user.dart"; -import "package:ente_ui/theme/colors.dart"; -import "package:ente_ui/theme/ente_theme.dart"; -import 'package:flutter/material.dart'; -import "package:locker/services/configuration.dart"; -import 'package:tuple/tuple.dart'; - -enum AvatarType { small, mini, tiny, extra } - -class UserAvatarWidget extends StatefulWidget { - final User user; - final AvatarType type; - final int currentUserID; - final bool thumbnailView; - - const UserAvatarWidget( - this.user, { - super.key, - this.currentUserID = -1, - this.type = AvatarType.mini, - this.thumbnailView = false, - }); - - @override - State createState() => _UserAvatarWidgetState(); - static const strokeWidth = 1.0; -} - -class _UserAvatarWidgetState extends State { - @override - Widget build(BuildContext context) { - final double size = getAvatarSize(widget.type); - return Container( - padding: const EdgeInsets.all(0.5), - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all( - color: widget.thumbnailView - ? strokeMutedDark - : getEnteColorScheme(context).strokeMuted, - width: UserAvatarWidget.strokeWidth, - strokeAlign: BorderSide.strokeAlignOutside, - ), - ), - child: SizedBox( - height: size, - width: size, - child: _FirstLetterCircularAvatar( - user: widget.user, - currentUserID: widget.currentUserID, - thumbnailView: widget.thumbnailView, - type: widget.type, - ), - ), - ); - } -} - -class _FirstLetterCircularAvatar extends StatefulWidget { - final User user; - final int currentUserID; - final bool thumbnailView; - final AvatarType type; - const _FirstLetterCircularAvatar({ - required this.user, - required this.currentUserID, - required this.thumbnailView, - required this.type, - }); - - @override - State<_FirstLetterCircularAvatar> createState() => - _FirstLetterCircularAvatarState(); -} - -class _FirstLetterCircularAvatarState - extends State<_FirstLetterCircularAvatar> { - @override - Widget build(BuildContext context) { - final colorScheme = getEnteColorScheme(context); - final displayChar = - (widget.user.name == null || widget.user.name!.isEmpty) - ? ((widget.user.email.isEmpty) - ? " " - : widget.user.email.substring(0, 1)) - : widget.user.name!.substring(0, 1); - Color decorationColor; - if ((widget.user.id != null && widget.user.id! < 0) || - widget.user.email == Configuration.instance.getEmail()) { - decorationColor = Colors.black; - } else { - decorationColor = colorScheme.avatarColors[(widget.user.email.length) - .remainder(colorScheme.avatarColors.length)]; - } - - final avatarStyle = getAvatarStyle(context, widget.type); - final double size = avatarStyle.item1; - final TextStyle textStyle = avatarStyle.item2; - return Container( - padding: const EdgeInsets.all(0.5), - decoration: BoxDecoration( - shape: BoxShape.circle, - border: Border.all( - color: widget.thumbnailView - ? strokeMutedDark - : getEnteColorScheme(context).strokeMuted, - width: UserAvatarWidget.strokeWidth, - strokeAlign: BorderSide.strokeAlignOutside, - ), - ), - child: SizedBox( - height: size, - width: size, - child: CircleAvatar( - backgroundColor: decorationColor, - child: Text( - displayChar.toUpperCase(), - // fixed color - style: textStyle.copyWith(color: Colors.white), - ), - ), - ), - ); - } - - Tuple2 getAvatarStyle( - BuildContext context, - AvatarType type, - ) { - final enteTextTheme = getEnteTextTheme(context); - switch (type) { - case AvatarType.small: - return Tuple2(32.0, enteTextTheme.small); - case AvatarType.mini: - return Tuple2(24.0, enteTextTheme.mini); - case AvatarType.tiny: - return Tuple2(18.0, enteTextTheme.tiny); - case AvatarType.extra: - return Tuple2(18.0, enteTextTheme.tiny); - } - } -} - -double getAvatarSize( - AvatarType type, -) { - switch (type) { - case AvatarType.small: - return 32.0; - case AvatarType.mini: - return 24.0; - case AvatarType.tiny: - return 18.0; - case AvatarType.extra: - return 18.0; - } -} - -class FirstLetterUserAvatar extends StatefulWidget { - final User user; - const FirstLetterUserAvatar(this.user, {super.key}); - - @override - State createState() => _FirstLetterUserAvatarState(); -} - -class _FirstLetterUserAvatarState extends State { - final currentUserEmail = Configuration.instance.getEmail(); - late User user; - - @override - void initState() { - super.initState(); - user = widget.user; - } - - @override - void didUpdateWidget(covariant FirstLetterUserAvatar oldWidget) { - super.didUpdateWidget(oldWidget); - if (oldWidget.user != widget.user) { - setState(() { - user = widget.user; - }); - } - } - - @override - Widget build(BuildContext context) { - final colorScheme = getEnteColorScheme(context); - final displayChar = (user.name == null || user.name!.isEmpty) - ? ((user.email.isEmpty) ? " " : user.email.substring(0, 1)) - : user.name!.substring(0, 1); - Color decorationColor; - if ((widget.user.id != null && widget.user.id! < 0) || - user.email == currentUserEmail) { - decorationColor = Colors.black; - } else { - decorationColor = colorScheme.avatarColors[ - (user.email.length).remainder(colorScheme.avatarColors.length)]; - } - return Container( - color: decorationColor, - child: Center( - child: Text( - displayChar.toUpperCase(), - style: getEnteTextTheme(context).small.copyWith(color: Colors.white), - ), - ), - ); - } -} diff --git a/mobile/apps/locker/lib/ui/sharing/verify_identity_dialog.dart b/mobile/apps/locker/lib/ui/sharing/verify_identity_dialog.dart deleted file mode 100644 index 81b3c11674..0000000000 --- a/mobile/apps/locker/lib/ui/sharing/verify_identity_dialog.dart +++ /dev/null @@ -1,208 +0,0 @@ -import "dart:convert"; - -import 'package:bip39/bip39.dart' as bip39; -import "package:crypto/crypto.dart"; -import "package:dotted_border/dotted_border.dart"; -import "package:ente_accounts/services/user_service.dart"; -import "package:ente_ui/components/buttons/button_widget.dart"; -import "package:ente_ui/components/buttons/models/button_type.dart"; -import "package:ente_ui/components/loading_widget.dart"; -import "package:ente_ui/theme/ente_theme.dart"; -import "package:ente_utils/share_utils.dart"; -import "package:flutter/material.dart"; -import "package:flutter/services.dart"; -import "package:locker/l10n/l10n.dart"; -import "package:locker/services/configuration.dart"; -import "package:logging/logging.dart"; - -class VerifyIdentifyDialog extends StatefulWidget { - // email id of the user who's verification ID is being displayed for - // verification - final String email; - - // self is true when the user is viewing their own verification ID - final bool self; - - VerifyIdentifyDialog({ - super.key, - required this.self, - this.email = '', - }) { - if (!self && email.isEmpty) { - throw ArgumentError("email cannot be empty when self is false"); - } - } - - @override - State createState() => _VerifyIdentifyDialogState(); -} - -class _VerifyIdentifyDialogState extends State { - final bool doesUserExist = true; - - @override - Widget build(BuildContext context) { - final textStyle = getEnteTextTheme(context); - final String subTitle = widget.self - ? context.l10n.thisIsYourVerificationId - : context.l10n.thisIsPersonVerificationId(widget.email); - final String bottomText = widget.self - ? context.l10n.someoneSharingAlbumsWithYouShouldSeeTheSameId - : context.l10n.howToViewShareeVerificationID; - - final AlertDialog alert = AlertDialog( - title: Text( - widget.self - ? context.l10n.verificationId - : context.l10n.verifyEmailID(widget.email), - ), - content: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - FutureBuilder( - future: _getPublicKey(), - builder: (context, snapshot) { - if (snapshot.hasData) { - final publicKey = snapshot.data!; - if (publicKey.isEmpty) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.l10n.emailNoEnteAccount(widget.email), - ), - const SizedBox(height: 24), - ButtonWidget( - buttonType: ButtonType.neutral, - icon: Icons.adaptive.share, - labelText: context.l10n.sendInvite, - isInAlert: true, - onTap: () async { - // ignore: unawaited_futures - shareText( - context.l10n.shareTextRecommendUsingEnte, - ); - }, - ), - ], - ); - } else { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - subTitle, - style: textStyle.bodyMuted, - ), - const SizedBox(height: 20), - _verificationIDWidget(context, publicKey), - const SizedBox(height: 16), - Text( - bottomText, - style: textStyle.bodyMuted, - ), - const SizedBox(height: 24), - ButtonWidget( - buttonType: ButtonType.neutral, - isInAlert: true, - labelText: - widget.self ? context.l10n.ok : context.l10n.done, - ), - ], - ); - } - } else if (snapshot.hasError) { - Logger("VerificationID") - .severe("failed to end userID", snapshot.error); - return Text( - context.l10n.somethingWentWrong, - style: textStyle.bodyMuted, - ); - } else { - return const SizedBox( - height: 200, - child: EnteLoadingWidget(), - ); - } - }, - ), - ], - ), - ); - return alert; - } - - Future _getPublicKey() async { - if (widget.self) { - return Configuration.instance.getKeyAttributes()!.publicKey; - } - final String? userPublicKey = - await UserService.instance.getPublicKey(widget.email); - if (userPublicKey == null) { - // user not found - return ""; - } - return userPublicKey; - } - - Widget _verificationIDWidget(BuildContext context, String publicKey) { - final colorScheme = getEnteColorScheme(context); - final textStyle = getEnteTextTheme(context); - final String verificationID = _generateVerificationID(publicKey); - return DottedBorder( - options: RoundedRectDottedBorderOptions( - color: colorScheme.strokeMuted, - strokeWidth: 1, - dashPattern: const [12, 6], - radius: const Radius.circular(8), - ), - child: Column( - children: [ - GestureDetector( - onTap: () async { - if (verificationID.isEmpty) { - return; - } - await Clipboard.setData( - ClipboardData(text: verificationID), - ); - // ignore: unawaited_futures - shareText( - widget.self - ? context.l10n.shareMyVerificationID(verificationID) - : context.l10n - .shareTextConfirmOthersVerificationID(verificationID), - ); - }, - child: Container( - decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(2), - ), - color: colorScheme.backgroundElevated2, - ), - padding: const EdgeInsets.all(20), - width: double.infinity, - child: Text( - verificationID, - style: textStyle.bodyBold, - ), - ), - ), - ], - ), - ); - } - - String _generateVerificationID(String publicKey) { - final inputBytes = base64.decode(publicKey); - final shaValue = sha256.convert(inputBytes); - return bip39.generateMnemonic( - strength: 256, - randomBytes: (int size) { - return Uint8List.fromList(shaValue.bytes); - }, - ); - } -} diff --git a/mobile/packages/sharing/lib/verify_identity_dialog.dart b/mobile/packages/sharing/lib/verify_identity_dialog.dart index 6e0a0448be..ab52778de7 100644 --- a/mobile/packages/sharing/lib/verify_identity_dialog.dart +++ b/mobile/packages/sharing/lib/verify_identity_dialog.dart @@ -15,7 +15,7 @@ import "package:flutter/material.dart"; import "package:flutter/services.dart"; import "package:logging/logging.dart"; -class VerifyIdentifyDialog extends StatefulWidget { +class VerifyIdentityDialog extends StatefulWidget { // email id of the user who's verification ID is being displayed for // verification final String email; @@ -24,7 +24,7 @@ class VerifyIdentifyDialog extends StatefulWidget { final bool self; final BaseConfiguration config; - VerifyIdentifyDialog({ + VerifyIdentityDialog({ super.key, required this.self, this.email = '', @@ -36,10 +36,10 @@ class VerifyIdentifyDialog extends StatefulWidget { } @override - State createState() => _VerifyIdentifyDialogState(); + State createState() => _VerifyIdentityDialogState(); } -class _VerifyIdentifyDialogState extends State { +class _VerifyIdentityDialogState extends State { final bool doesUserExist = true; @override From 13c9646f58ce6b80e0205144e2da36aafd7a58bd Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 05:51:39 +0530 Subject: [PATCH 11/19] MInor fix --- mobile/apps/locker/lib/extensions/user_extension.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/apps/locker/lib/extensions/user_extension.dart b/mobile/apps/locker/lib/extensions/user_extension.dart index 7976f569b4..214b8dc5e9 100644 --- a/mobile/apps/locker/lib/extensions/user_extension.dart +++ b/mobile/apps/locker/lib/extensions/user_extension.dart @@ -3,7 +3,7 @@ import "package:ente_sharing/models/user.dart"; extension UserExtension on User { //Some initial users have name in name field. String? get displayName => - // ignore: deprecated_member_use_from_same_package + // ignore: deprecated_member_use_from_same_package, deprecated_member_use ((name?.isEmpty ?? true) ? null : name); String get nameOrEmail { From 7e5e11ba876311c0a2b9a9e92f91bab3e48e185e Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:07:42 +0530 Subject: [PATCH 12/19] Update package strings --- mobile/apps/locker/lib/l10n/app_en.arb | 3 +- .../locker/lib/l10n/app_localizations.dart | 6 + .../locker/lib/l10n/app_localizations_en.dart | 3 + .../strings/lib/l10n/arb/strings_en.arb | 42 ++++- .../lib/l10n/strings_localizations.dart | 120 +++++++++++++ .../lib/l10n/strings_localizations_ar.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_be.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_bg.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ca.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_cs.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_da.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_de.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_el.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_en.dart | 75 ++++++++ .../lib/l10n/strings_localizations_es.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_et.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_fa.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_fi.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_fr.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_gu.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_he.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_hi.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_hu.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_id.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_it.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ja.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ka.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_km.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ko.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_lt.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_lv.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ml.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_nl.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_pl.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_pt.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ro.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ru.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_sk.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_sl.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_sr.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_sv.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_ti.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_tr.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_uk.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_vi.dart | 164 ++++++++++++++++++ .../lib/l10n/strings_localizations_zh.dart | 164 ++++++++++++++++++ 46 files changed, 6807 insertions(+), 2 deletions(-) diff --git a/mobile/apps/locker/lib/l10n/app_en.arb b/mobile/apps/locker/lib/l10n/app_en.arb index 97bc555e1f..7e2043dae6 100644 --- a/mobile/apps/locker/lib/l10n/app_en.arb +++ b/mobile/apps/locker/lib/l10n/app_en.arb @@ -504,5 +504,6 @@ "filesAddedByYouWillBeRemovedFromTheCollection": "Files added by you will be removed from the collection", "leaveSharedCollection": "Leave shared collection?", "noSystemLockFound": "No system lock found", - "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings." + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", + "legacy": "Legacy" } diff --git a/mobile/apps/locker/lib/l10n/app_localizations.dart b/mobile/apps/locker/lib/l10n/app_localizations.dart index 98f165ad44..77363e216d 100644 --- a/mobile/apps/locker/lib/l10n/app_localizations.dart +++ b/mobile/apps/locker/lib/l10n/app_localizations.dart @@ -1587,6 +1587,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'To enable app lock, please setup device passcode or screen lock in your system settings.'** String get toEnableAppLockPleaseSetupDevicePasscodeOrScreen; + + /// No description provided for @legacy. + /// + /// In en, this message translates to: + /// **'Legacy'** + String get legacy; } class _AppLocalizationsDelegate diff --git a/mobile/apps/locker/lib/l10n/app_localizations_en.dart b/mobile/apps/locker/lib/l10n/app_localizations_en.dart index 51842c3df3..7673ea2212 100644 --- a/mobile/apps/locker/lib/l10n/app_localizations_en.dart +++ b/mobile/apps/locker/lib/l10n/app_localizations_en.dart @@ -903,4 +903,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get toEnableAppLockPleaseSetupDevicePasscodeOrScreen => 'To enable app lock, please setup device passcode or screen lock in your system settings.'; + + @override + String get legacy => 'Legacy'; } diff --git a/mobile/packages/strings/lib/l10n/arb/strings_en.arb b/mobile/packages/strings/lib/l10n/arb/strings_en.arb index d91b891210..c1480b90fd 100644 --- a/mobile/packages/strings/lib/l10n/arb/strings_en.arb +++ b/mobile/packages/strings/lib/l10n/arb/strings_en.arb @@ -823,5 +823,45 @@ } } }, - "trustedInviteBody": "You have been invited to be a legacy contact by {email}." + "warning": "Warning", + "proceed": "Proceed", + "done": "Done", + "enterEmail": "Enter email", + "verifyIDLabel": "Verify", + "invalidEmailAddress": "Invalid email address", + "enterValidEmail": "Please enter a valid email address.", + "addANewEmail": "Add a new email", + "orPickAnExistingOne": "Or pick an existing one", + "shareTextRecommendUsingEnte": "Download Ente so we can easily share original quality files\n\nhttps://ente.io", + "sendInvite": "Send invite", + "trustedInviteBody": "You have been invited to be a legacy contact by {email}.", + "verifyEmailID": "Verify {email}", + "thisIsYourVerificationId": "This is your Verification ID", + "someoneSharingAlbumsWithYouShouldSeeTheSameId": "Someone sharing albums with you should see the same ID on their device.", + "howToViewShareeVerificationID": "Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.", + "thisIsPersonVerificationId": "This is {email}'s Verification ID", + "@thisIsPersonVerificationId": { + "placeholders": { + "email": { + "type": "String", + "example": "someone@ente.io" + } + } + }, + "confirmAddingTrustedContact": "You are about to add {email} as a trusted contact. They will be able to recover your account if you are absent for {numOfDays} days.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "emailNoEnteAccount": "{email} does not have an Ente account.\n\nSend them an invite to share files.", + "shareMyVerificationID": "Here's my verification ID: {verificationID} for ente.io.", + "shareTextConfirmOthersVerificationID": "Hey, can you confirm that this is your ente.io verification ID: {verificationID}" } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations.dart b/mobile/packages/strings/lib/l10n/strings_localizations.dart index ffb142a8e7..4e7c857b7b 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations.dart @@ -1439,11 +1439,131 @@ abstract class StringsLocalizations { /// **'You can now recover {email}\'s account by setting a new password.'** String recoveryReady(String email); + /// No description provided for @warning. + /// + /// In en, this message translates to: + /// **'Warning'** + String get warning; + + /// No description provided for @proceed. + /// + /// In en, this message translates to: + /// **'Proceed'** + String get proceed; + + /// No description provided for @done. + /// + /// In en, this message translates to: + /// **'Done'** + String get done; + + /// No description provided for @enterEmail. + /// + /// In en, this message translates to: + /// **'Enter email'** + String get enterEmail; + + /// No description provided for @verifyIDLabel. + /// + /// In en, this message translates to: + /// **'Verify'** + String get verifyIDLabel; + + /// No description provided for @invalidEmailAddress. + /// + /// In en, this message translates to: + /// **'Invalid email address'** + String get invalidEmailAddress; + + /// No description provided for @enterValidEmail. + /// + /// In en, this message translates to: + /// **'Please enter a valid email address.'** + String get enterValidEmail; + + /// No description provided for @addANewEmail. + /// + /// In en, this message translates to: + /// **'Add a new email'** + String get addANewEmail; + + /// No description provided for @orPickAnExistingOne. + /// + /// In en, this message translates to: + /// **'Or pick an existing one'** + String get orPickAnExistingOne; + + /// No description provided for @shareTextRecommendUsingEnte. + /// + /// In en, this message translates to: + /// **'Download Ente so we can easily share original quality files\n\nhttps://ente.io'** + String get shareTextRecommendUsingEnte; + + /// No description provided for @sendInvite. + /// + /// In en, this message translates to: + /// **'Send invite'** + String get sendInvite; + /// No description provided for @trustedInviteBody. /// /// In en, this message translates to: /// **'You have been invited to be a legacy contact by {email}.'** String trustedInviteBody(Object email); + + /// No description provided for @verifyEmailID. + /// + /// In en, this message translates to: + /// **'Verify {email}'** + String verifyEmailID(Object email); + + /// No description provided for @thisIsYourVerificationId. + /// + /// In en, this message translates to: + /// **'This is your Verification ID'** + String get thisIsYourVerificationId; + + /// No description provided for @someoneSharingAlbumsWithYouShouldSeeTheSameId. + /// + /// In en, this message translates to: + /// **'Someone sharing albums with you should see the same ID on their device.'** + String get someoneSharingAlbumsWithYouShouldSeeTheSameId; + + /// No description provided for @howToViewShareeVerificationID. + /// + /// In en, this message translates to: + /// **'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'** + String get howToViewShareeVerificationID; + + /// No description provided for @thisIsPersonVerificationId. + /// + /// In en, this message translates to: + /// **'This is {email}\'s Verification ID'** + String thisIsPersonVerificationId(String email); + + /// No description provided for @confirmAddingTrustedContact. + /// + /// In en, this message translates to: + /// **'You are about to add {email} as a trusted contact. They will be able to recover your account if you are absent for {numOfDays} days.'** + String confirmAddingTrustedContact(String email, int numOfDays); + + /// No description provided for @emailNoEnteAccount. + /// + /// In en, this message translates to: + /// **'{email} does not have an Ente account.\n\nSend them an invite to share files.'** + String emailNoEnteAccount(Object email); + + /// No description provided for @shareMyVerificationID. + /// + /// In en, this message translates to: + /// **'Here\'s my verification ID: {verificationID} for ente.io.'** + String shareMyVerificationID(Object verificationID); + + /// No description provided for @shareTextConfirmOthersVerificationID. + /// + /// In en, this message translates to: + /// **'Hey, can you confirm that this is your ente.io verification ID: {verificationID}'** + String shareTextConfirmOthersVerificationID(Object verificationID); } class _StringsLocalizationsDelegate diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart index cdffa58cc6..25c32d9bd5 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart @@ -622,4 +622,168 @@ class StringsLocalizationsAr extends StringsLocalizations { @override String get endpointUpdatedMessage => 'حُدِّثَت نقطة الطرف بنجاح'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_be.dart b/mobile/packages/strings/lib/l10n/strings_localizations_be.dart index 3ff70f8c41..8ebba0d16e 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_be.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_be.dart @@ -623,4 +623,168 @@ class StringsLocalizationsBe extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart b/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart index a79fe0c723..58a6bb082c 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart @@ -630,4 +630,168 @@ class StringsLocalizationsBg extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Крайната точка е актуализирана успешно'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart index e4078b94c0..118e8c149a 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart @@ -632,4 +632,168 @@ class StringsLocalizationsCa extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Extrem actualitzat correctament'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart b/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart index f72957d5d5..917cec0d41 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart @@ -624,4 +624,168 @@ class StringsLocalizationsCs extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Koncový bod byl úspěšně aktualizován'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_da.dart b/mobile/packages/strings/lib/l10n/strings_localizations_da.dart index 82f2d03070..bdf421bf7c 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_da.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_da.dart @@ -626,4 +626,168 @@ class StringsLocalizationsDa extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint opdateret'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_de.dart b/mobile/packages/strings/lib/l10n/strings_localizations_de.dart index 3bf0aca783..2788ee0571 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_de.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_de.dart @@ -633,4 +633,168 @@ class StringsLocalizationsDe extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpunkt erfolgreich aktualisiert'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_el.dart b/mobile/packages/strings/lib/l10n/strings_localizations_el.dart index f2af902f83..57209ee5ce 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_el.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_el.dart @@ -634,4 +634,168 @@ class StringsLocalizationsEl extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Το τερματκό σημείο ενημερώθηκε επιτυχώς'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart index 1b56ab38f8..3da49a2b79 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart @@ -708,8 +708,83 @@ class StringsLocalizationsEn extends StringsLocalizations { return 'You can now recover $email\'s account by setting a new password.'; } + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + @override String trustedInviteBody(Object email) { return 'You have been invited to be a legacy contact by $email.'; } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_es.dart b/mobile/packages/strings/lib/l10n/strings_localizations_es.dart index d93fcd07e8..23f74629bd 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_es.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_es.dart @@ -632,4 +632,168 @@ class StringsLocalizationsEs extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint actualizado con éxito'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_et.dart b/mobile/packages/strings/lib/l10n/strings_localizations_et.dart index 49506d60ef..f846695763 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_et.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_et.dart @@ -626,4 +626,168 @@ class StringsLocalizationsEt extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart index 8545b269d0..a2f53c0d46 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart @@ -623,4 +623,168 @@ class StringsLocalizationsFa extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart index 3081b85c8f..37aeb28fe4 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart @@ -624,4 +624,168 @@ class StringsLocalizationsFi extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart index 3375cff00a..4a985cf0c7 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart @@ -635,4 +635,168 @@ class StringsLocalizationsFr extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Point de terminaison mis à jour avec succès'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart b/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart index caebb756ec..2fced4cfb2 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart @@ -624,4 +624,168 @@ class StringsLocalizationsGu extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_he.dart b/mobile/packages/strings/lib/l10n/strings_localizations_he.dart index c1bc4531fb..50a57e9e48 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_he.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_he.dart @@ -618,4 +618,168 @@ class StringsLocalizationsHe extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart index f45d282cb2..f82ae4686e 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart @@ -624,4 +624,168 @@ class StringsLocalizationsHi extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart b/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart index 3ccc5091ae..0662df1aa6 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart @@ -627,4 +627,168 @@ class StringsLocalizationsHu extends StringsLocalizations { @override String get endpointUpdatedMessage => 'A végpont sikeresen frissítve'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_id.dart b/mobile/packages/strings/lib/l10n/strings_localizations_id.dart index e3839340a6..f4b303a6ce 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_id.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_id.dart @@ -627,4 +627,168 @@ class StringsLocalizationsId extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint berhasil diubah'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_it.dart b/mobile/packages/strings/lib/l10n/strings_localizations_it.dart index 9a13c0cd7c..a55b4033cf 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_it.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_it.dart @@ -631,4 +631,168 @@ class StringsLocalizationsIt extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint aggiornato con successo'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart index 54766bcdb1..01d1741a7f 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart @@ -600,4 +600,168 @@ class StringsLocalizationsJa extends StringsLocalizations { @override String get endpointUpdatedMessage => 'エンドポイントの更新に成功しました'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart index 3470bb7b33..995c060e71 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart @@ -626,4 +626,168 @@ class StringsLocalizationsKa extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_km.dart b/mobile/packages/strings/lib/l10n/strings_localizations_km.dart index e918845c22..b5f65bf3c1 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_km.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_km.dart @@ -623,4 +623,168 @@ class StringsLocalizationsKm extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart index bdb0abf69e..0ac8ee2964 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart @@ -601,4 +601,168 @@ class StringsLocalizationsKo extends StringsLocalizations { @override String get endpointUpdatedMessage => '엔드포인트가 성공적으로 업데이트됨'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart b/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart index 67514db54f..6e06ddfcb6 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart @@ -627,4 +627,168 @@ class StringsLocalizationsLt extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Galutinis taškas sėkmingai atnaujintas'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart b/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart index d6762e17e9..33cc8ccc60 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart @@ -623,4 +623,168 @@ class StringsLocalizationsLv extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart index cf523a3fb0..beeb0a9d48 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart @@ -624,4 +624,168 @@ class StringsLocalizationsMl extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart index 7fb99652a5..5baca9b1e7 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart @@ -629,4 +629,168 @@ class StringsLocalizationsNl extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Eindpunt met succes bijgewerkt'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart index 5d636efe39..7ba1865b1d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart @@ -627,4 +627,168 @@ class StringsLocalizationsPl extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Punkt końcowy zaktualizowany pomyślnie'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart b/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart index b339c4f481..8375b9dc5c 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart @@ -626,4 +626,168 @@ class StringsLocalizationsPt extends StringsLocalizations { @override String get endpointUpdatedMessage => 'O endpoint foi atualizado'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart index 432e033823..aaae04f7dd 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart @@ -628,4 +628,168 @@ class StringsLocalizationsRo extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart index 52dfd4e049..64572d7227 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart @@ -629,4 +629,168 @@ class StringsLocalizationsRu extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Конечная точка успешно обновлена'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart index 6ab32314df..ef302d3e00 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart @@ -626,4 +626,168 @@ class StringsLocalizationsSk extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint úspešne aktualizovaný'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart index 8571b1983f..63aad6e03d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart @@ -626,4 +626,168 @@ class StringsLocalizationsSl extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint posodobljen uspešno'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart index 3a2c2fc4f7..dddc143b2d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart @@ -627,4 +627,168 @@ class StringsLocalizationsSr extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Крајна тачка успешно ажурирана'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart index 96d85243d0..2df214d636 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart @@ -625,4 +625,168 @@ class StringsLocalizationsSv extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Slutpunkten har uppdaterats'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart index 5f29ac5338..1cc9b6ea59 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart @@ -623,4 +623,168 @@ class StringsLocalizationsTi extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Endpoint updated successfully'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart index c5be60b8db..f1f9c791e2 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart @@ -629,4 +629,168 @@ class StringsLocalizationsTr extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Uç nokta başarıyla güncellendi'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart b/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart index 31acfef908..618559c949 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart @@ -631,4 +631,168 @@ class StringsLocalizationsUk extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Точка входу успішно оновлена'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart index a55e1a242c..7c489bcdce 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart @@ -625,4 +625,168 @@ class StringsLocalizationsVi extends StringsLocalizations { @override String get endpointUpdatedMessage => 'Cập nhật điểm cuối thành công'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart b/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart index d0447c1877..ae8b09a000 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart @@ -590,6 +590,170 @@ class StringsLocalizationsZh extends StringsLocalizations { @override String get endpointUpdatedMessage => '端点更新成功'; + + @override + String get yes => 'Yes'; + + @override + String get remove => 'Remove'; + + @override + String get addMore => 'Add more'; + + @override + String get somethingWentWrong => 'Something went wrong'; + + @override + String get legacy => 'Legacy'; + + @override + String get recoveryWarning => + 'A trusted contact is trying to access your account'; + + @override + String recoveryWarningBody(Object email) { + return '$email is trying to recover your account.'; + } + + @override + String get legacyPageDesc => + 'Legacy allows trusted contacts to access your account in your absence.'; + + @override + String get legacyPageDesc2 => + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.'; + + @override + String get legacyAccounts => 'Legacy accounts'; + + @override + String get trustedContacts => 'Trusted contacts'; + + @override + String get addTrustedContact => 'Add Trusted Contact'; + + @override + String get removeInvite => 'Remove invite'; + + @override + String get rejectRecovery => 'Reject recovery'; + + @override + String get recoveryInitiated => 'Recovery initiated'; + + @override + String recoveryInitiatedDesc(int days, String email) { + return 'You can access the account after $days days. A notification will be sent to $email.'; + } + + @override + String get removeYourselfAsTrustedContact => + 'Remove yourself as trusted contact'; + + @override + String get declineTrustInvite => 'Decline Invite'; + + @override + String get cancelAccountRecovery => 'Cancel recovery'; + + @override + String get recoveryAccount => 'Recover account'; + + @override + String get cancelAccountRecoveryBody => + 'Are you sure you want to cancel recovery?'; + + @override + String get startAccountRecoveryTitle => 'Start recovery'; + + @override + String get whyAddTrustContact => + 'Trusted contact can help in recovering your data.'; + + @override + String recoveryReady(String email) { + return 'You can now recover $email\'s account by setting a new password.'; + } + + @override + String get warning => 'Warning'; + + @override + String get proceed => 'Proceed'; + + @override + String get done => 'Done'; + + @override + String get enterEmail => 'Enter email'; + + @override + String get verifyIDLabel => 'Verify'; + + @override + String get invalidEmailAddress => 'Invalid email address'; + + @override + String get enterValidEmail => 'Please enter a valid email address.'; + + @override + String get addANewEmail => 'Add a new email'; + + @override + String get orPickAnExistingOne => 'Or pick an existing one'; + + @override + String get shareTextRecommendUsingEnte => + 'Download Ente so we can easily share original quality files\n\nhttps://ente.io'; + + @override + String get sendInvite => 'Send invite'; + + @override + String trustedInviteBody(Object email) { + return 'You have been invited to be a legacy contact by $email.'; + } + + @override + String verifyEmailID(Object email) { + return 'Verify $email'; + } + + @override + String get thisIsYourVerificationId => 'This is your Verification ID'; + + @override + String get someoneSharingAlbumsWithYouShouldSeeTheSameId => + 'Someone sharing albums with you should see the same ID on their device.'; + + @override + String get howToViewShareeVerificationID => + 'Please ask them to long-press their email address on the settings screen, and verify that the IDs on both devices match.'; + + @override + String thisIsPersonVerificationId(String email) { + return 'This is $email\'s Verification ID'; + } + + @override + String confirmAddingTrustedContact(String email, int numOfDays) { + return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; + } + + @override + String emailNoEnteAccount(Object email) { + return '$email does not have an Ente account.\n\nSend them an invite to share files.'; + } + + @override + String shareMyVerificationID(Object verificationID) { + return 'Here\'s my verification ID: $verificationID for ente.io.'; + } + + @override + String shareTextConfirmOthersVerificationID(Object verificationID) { + return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; + } } /// The translations for Chinese, as used in China (`zh_CN`). From e985200e67f6323ed0e269bb572bfa3f3356b23b Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:11:31 +0530 Subject: [PATCH 13/19] Minor fix --- mobile/packages/sharing/analysis_options.yaml | 73 +------------------ 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/mobile/packages/sharing/analysis_options.yaml b/mobile/packages/sharing/analysis_options.yaml index 1bd78bc1b0..f04c6cf0f3 100644 --- a/mobile/packages/sharing/analysis_options.yaml +++ b/mobile/packages/sharing/analysis_options.yaml @@ -1,72 +1 @@ -# For more linters, we can check https://dart-lang.github.io/linter/lints/index.html -# or https://pub.dev/packages/lint (Effective dart) -# use "flutter analyze ." or "dart analyze ." for running lint checks - -include: package:flutter_lints/flutter.yaml -linter: - rules: - # Ref https://github.com/flutter/packages/blob/master/packages/flutter_lints/lib/flutter.yaml - # Ref https://dart-lang.github.io/linter/lints/ - - avoid_print - - avoid_unnecessary_containers - - avoid_web_libraries_in_flutter - - no_logic_in_create_state - - prefer_const_constructors - - prefer_const_constructors_in_immutables - - prefer_const_declarations - - prefer_const_literals_to_create_immutables - - prefer_final_locals - - require_trailing_commas - - sized_box_for_whitespace - - use_full_hex_values_for_flutter_colors - - use_key_in_widget_constructors - - cancel_subscriptions - - - - avoid_empty_else - - exhaustive_cases - - # just style suggestions - - sort_pub_dependencies - - use_rethrow_when_possible - - prefer_double_quotes - - directives_ordering - - always_use_package_imports - - sort_child_properties_last - - unawaited_futures - -analyzer: - errors: - avoid_empty_else: error - exhaustive_cases: error - curly_braces_in_flow_control_structures: error - directives_ordering: error - require_trailing_commas: error - always_use_package_imports: warning - prefer_final_fields: error - unused_import: error - camel_case_types: error - prefer_is_empty: warning - use_rethrow_when_possible: info - unused_field: warning - use_key_in_widget_constructors: warning - sort_child_properties_last: warning - sort_pub_dependencies: warning - library_private_types_in_public_api: warning - constant_identifier_names: ignore - prefer_const_constructors: warning - prefer_const_declarations: warning - prefer_const_constructors_in_immutables: warning - prefer_final_locals: warning - unnecessary_const: error - cancel_subscriptions: error - unrelated_type_equality_checks: error - unnecessary_cast: info - - - unawaited_futures: warning # convert to warning after fixing existing issues - invalid_dependency: info - use_build_context_synchronously: ignore # experimental lint, requires many changes - prefer_interpolation_to_compose_strings: ignore # later too many warnings - prefer_double_quotes: ignore # too many warnings - avoid_renaming_method_parameters: ignore # incorrect warnings for `equals` overrides +include: ../../analysis_options.yaml From c51dff5a29ba24351c823e558532d6fc068d0f5b Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:45:02 +0530 Subject: [PATCH 14/19] Move user_dialog to package --- .../ui/lib}/components/user_dialogs.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) rename mobile/{apps/locker/lib/ui => packages/ui/lib}/components/user_dialogs.dart (74%) diff --git a/mobile/apps/locker/lib/ui/components/user_dialogs.dart b/mobile/packages/ui/lib/components/user_dialogs.dart similarity index 74% rename from mobile/apps/locker/lib/ui/components/user_dialogs.dart rename to mobile/packages/ui/lib/components/user_dialogs.dart index 206a30fa70..1a033e5fb9 100644 --- a/mobile/apps/locker/lib/ui/components/user_dialogs.dart +++ b/mobile/packages/ui/lib/components/user_dialogs.dart @@ -1,28 +1,29 @@ import "dart:async"; +import "package:ente_strings/ente_strings.dart"; import "package:ente_ui/components/buttons/button_widget.dart"; import "package:ente_ui/components/buttons/models/button_type.dart"; import "package:ente_ui/components/dialog_widget.dart"; import "package:ente_utils/share_utils.dart"; import "package:flutter/material.dart"; -import "package:locker/l10n/l10n.dart"; + Future showInviteDialog(BuildContext context, String email) async { await showDialogWidget( context: context, - title: context.l10n.inviteToEnte, + title: context.strings.inviteToEnte, icon: Icons.info_outline, - body: context.l10n.emailNoEnteAccount(email), + body: context.strings.emailNoEnteAccount(email), isDismissible: true, buttons: [ ButtonWidget( buttonType: ButtonType.neutral, icon: Icons.adaptive.share, - labelText: context.l10n.sendInvite, + labelText: context.strings.sendInvite, isInAlert: true, onTap: () async { unawaited( shareText( - context.l10n.shareTextRecommendUsingEnte, + context.strings.shareTextRecommendUsingEnte, ), ); }, From 3b54fa41f63fa08f0fbbf9db882318126e500d4e Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:45:17 +0530 Subject: [PATCH 15/19] Remove duplicate import of user_dialogs in collection_actions.dart --- mobile/apps/locker/lib/utils/collection_actions.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/apps/locker/lib/utils/collection_actions.dart b/mobile/apps/locker/lib/utils/collection_actions.dart index 5bde888fa7..39225a7fd8 100644 --- a/mobile/apps/locker/lib/utils/collection_actions.dart +++ b/mobile/apps/locker/lib/utils/collection_actions.dart @@ -7,6 +7,7 @@ import 'package:ente_ui/components/buttons/button_widget.dart'; import 'package:ente_ui/components/buttons/models/button_type.dart'; import "package:ente_ui/components/dialog_widget.dart"; import "package:ente_ui/components/progress_dialog.dart"; +import "package:ente_ui/components/user_dialogs.dart"; import 'package:ente_ui/utils/dialog_util.dart'; import "package:ente_utils/email_util.dart"; import "package:ente_utils/share_utils.dart"; @@ -18,7 +19,6 @@ import "package:locker/services/collections/collections_api_client.dart"; import 'package:locker/services/collections/collections_service.dart'; import 'package:locker/services/collections/models/collection.dart'; import "package:locker/services/configuration.dart"; -import "package:locker/ui/components/user_dialogs.dart"; import 'package:locker/utils/snack_bar_utils.dart'; import 'package:logging/logging.dart'; From 0e0ba2d5afbbad6c39d7aa0322186991d30360e3 Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:47:22 +0530 Subject: [PATCH 16/19] Extract strings --- mobile/packages/strings/lib/l10n/arb/strings_en.arb | 4 +++- .../packages/strings/lib/l10n/strings_localizations_ar.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_be.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_bg.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ca.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_cs.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_da.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_de.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_el.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_en.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_es.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_et.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_fa.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_fi.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_fr.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_gu.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_he.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_hi.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_hu.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_id.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_it.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ja.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ka.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_km.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ko.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_lt.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_lv.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ml.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_nl.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_pl.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_pt.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ro.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ru.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_sk.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_sl.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_sr.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_sv.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_ti.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_tr.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_uk.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_vi.dart | 6 ++++++ .../packages/strings/lib/l10n/strings_localizations_zh.dart | 6 ++++++ 42 files changed, 249 insertions(+), 1 deletion(-) diff --git a/mobile/packages/strings/lib/l10n/arb/strings_en.arb b/mobile/packages/strings/lib/l10n/arb/strings_en.arb index c1480b90fd..76fbaa8a84 100644 --- a/mobile/packages/strings/lib/l10n/arb/strings_en.arb +++ b/mobile/packages/strings/lib/l10n/arb/strings_en.arb @@ -861,7 +861,9 @@ } } }, + "youCannotShareWithYourself": "You cannot share with yourself", "emailNoEnteAccount": "{email} does not have an Ente account.\n\nSend them an invite to share files.", "shareMyVerificationID": "Here's my verification ID: {verificationID} for ente.io.", - "shareTextConfirmOthersVerificationID": "Hey, can you confirm that this is your ente.io verification ID: {verificationID}" + "shareTextConfirmOthersVerificationID": "Hey, can you confirm that this is your ente.io verification ID: {verificationID}", + "inviteToEnte": "Invite to Ente" } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart index 25c32d9bd5..0052021c3d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ar.dart @@ -772,6 +772,9 @@ class StringsLocalizationsAr extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -786,4 +789,7 @@ class StringsLocalizationsAr extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_be.dart b/mobile/packages/strings/lib/l10n/strings_localizations_be.dart index 8ebba0d16e..db3ca2ab10 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_be.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_be.dart @@ -773,6 +773,9 @@ class StringsLocalizationsBe extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsBe extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart b/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart index 58a6bb082c..4abc9debe7 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_bg.dart @@ -780,6 +780,9 @@ class StringsLocalizationsBg extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -794,4 +797,7 @@ class StringsLocalizationsBg extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart index 118e8c149a..c46efc0eed 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ca.dart @@ -782,6 +782,9 @@ class StringsLocalizationsCa extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -796,4 +799,7 @@ class StringsLocalizationsCa extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart b/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart index 917cec0d41..c7347305f3 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_cs.dart @@ -774,6 +774,9 @@ class StringsLocalizationsCs extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -788,4 +791,7 @@ class StringsLocalizationsCs extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_da.dart b/mobile/packages/strings/lib/l10n/strings_localizations_da.dart index bdf421bf7c..9845f3d0e9 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_da.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_da.dart @@ -776,6 +776,9 @@ class StringsLocalizationsDa extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsDa extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_de.dart b/mobile/packages/strings/lib/l10n/strings_localizations_de.dart index 2788ee0571..f9454b5836 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_de.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_de.dart @@ -783,6 +783,9 @@ class StringsLocalizationsDe extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -797,4 +800,7 @@ class StringsLocalizationsDe extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_el.dart b/mobile/packages/strings/lib/l10n/strings_localizations_el.dart index 57209ee5ce..60b3233560 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_el.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_el.dart @@ -784,6 +784,9 @@ class StringsLocalizationsEl extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -798,4 +801,7 @@ class StringsLocalizationsEl extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart index 3da49a2b79..1eb8d48274 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_en.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_en.dart @@ -773,6 +773,9 @@ class StringsLocalizationsEn extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsEn extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_es.dart b/mobile/packages/strings/lib/l10n/strings_localizations_es.dart index 23f74629bd..7c75163918 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_es.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_es.dart @@ -782,6 +782,9 @@ class StringsLocalizationsEs extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -796,4 +799,7 @@ class StringsLocalizationsEs extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_et.dart b/mobile/packages/strings/lib/l10n/strings_localizations_et.dart index f846695763..794a452adf 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_et.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_et.dart @@ -776,6 +776,9 @@ class StringsLocalizationsEt extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsEt extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart index a2f53c0d46..d3b04b1c8c 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fa.dart @@ -773,6 +773,9 @@ class StringsLocalizationsFa extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsFa extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart index 37aeb28fe4..9b2c6ad46d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fi.dart @@ -774,6 +774,9 @@ class StringsLocalizationsFi extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -788,4 +791,7 @@ class StringsLocalizationsFi extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart index 4a985cf0c7..0857ab2aea 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_fr.dart @@ -785,6 +785,9 @@ class StringsLocalizationsFr extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -799,4 +802,7 @@ class StringsLocalizationsFr extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart b/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart index 2fced4cfb2..794d5b5547 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_gu.dart @@ -774,6 +774,9 @@ class StringsLocalizationsGu extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -788,4 +791,7 @@ class StringsLocalizationsGu extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_he.dart b/mobile/packages/strings/lib/l10n/strings_localizations_he.dart index 50a57e9e48..cd889915c4 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_he.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_he.dart @@ -768,6 +768,9 @@ class StringsLocalizationsHe extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -782,4 +785,7 @@ class StringsLocalizationsHe extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart index f82ae4686e..29bff72fb0 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_hi.dart @@ -774,6 +774,9 @@ class StringsLocalizationsHi extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -788,4 +791,7 @@ class StringsLocalizationsHi extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart b/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart index 0662df1aa6..3b00e55857 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_hu.dart @@ -777,6 +777,9 @@ class StringsLocalizationsHu extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -791,4 +794,7 @@ class StringsLocalizationsHu extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_id.dart b/mobile/packages/strings/lib/l10n/strings_localizations_id.dart index f4b303a6ce..a3e880b229 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_id.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_id.dart @@ -777,6 +777,9 @@ class StringsLocalizationsId extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -791,4 +794,7 @@ class StringsLocalizationsId extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_it.dart b/mobile/packages/strings/lib/l10n/strings_localizations_it.dart index a55b4033cf..470078cef5 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_it.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_it.dart @@ -781,6 +781,9 @@ class StringsLocalizationsIt extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -795,4 +798,7 @@ class StringsLocalizationsIt extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart index 01d1741a7f..a874db43b1 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ja.dart @@ -750,6 +750,9 @@ class StringsLocalizationsJa extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -764,4 +767,7 @@ class StringsLocalizationsJa extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart index 995c060e71..b9c18550b1 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ka.dart @@ -776,6 +776,9 @@ class StringsLocalizationsKa extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsKa extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_km.dart b/mobile/packages/strings/lib/l10n/strings_localizations_km.dart index b5f65bf3c1..8b45419ea1 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_km.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_km.dart @@ -773,6 +773,9 @@ class StringsLocalizationsKm extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsKm extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart index 0ac8ee2964..a7b3e99e40 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ko.dart @@ -751,6 +751,9 @@ class StringsLocalizationsKo extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -765,4 +768,7 @@ class StringsLocalizationsKo extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart b/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart index 6e06ddfcb6..552f0ec697 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_lt.dart @@ -777,6 +777,9 @@ class StringsLocalizationsLt extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -791,4 +794,7 @@ class StringsLocalizationsLt extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart b/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart index 33cc8ccc60..2f3bebe180 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_lv.dart @@ -773,6 +773,9 @@ class StringsLocalizationsLv extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsLv extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart index beeb0a9d48..49bed40686 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ml.dart @@ -774,6 +774,9 @@ class StringsLocalizationsMl extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -788,4 +791,7 @@ class StringsLocalizationsMl extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart index 5baca9b1e7..5dadf58d7d 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_nl.dart @@ -779,6 +779,9 @@ class StringsLocalizationsNl extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -793,4 +796,7 @@ class StringsLocalizationsNl extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart index 7ba1865b1d..c4e22c4bf8 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_pl.dart @@ -777,6 +777,9 @@ class StringsLocalizationsPl extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -791,4 +794,7 @@ class StringsLocalizationsPl extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart b/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart index 8375b9dc5c..c5d84c7c0a 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_pt.dart @@ -776,6 +776,9 @@ class StringsLocalizationsPt extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsPt extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart index aaae04f7dd..a5fd9a154c 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ro.dart @@ -778,6 +778,9 @@ class StringsLocalizationsRo extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -792,4 +795,7 @@ class StringsLocalizationsRo extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart index 64572d7227..621a1b2328 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ru.dart @@ -779,6 +779,9 @@ class StringsLocalizationsRu extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -793,4 +796,7 @@ class StringsLocalizationsRu extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart index ef302d3e00..f3ee0e678b 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sk.dart @@ -776,6 +776,9 @@ class StringsLocalizationsSk extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsSk extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart index 63aad6e03d..dddf412b3f 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sl.dart @@ -776,6 +776,9 @@ class StringsLocalizationsSl extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -790,4 +793,7 @@ class StringsLocalizationsSl extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart index dddc143b2d..e6a6e0e3d6 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sr.dart @@ -777,6 +777,9 @@ class StringsLocalizationsSr extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -791,4 +794,7 @@ class StringsLocalizationsSr extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart b/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart index 2df214d636..6c3049ffeb 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_sv.dart @@ -775,6 +775,9 @@ class StringsLocalizationsSv extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -789,4 +792,7 @@ class StringsLocalizationsSv extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart b/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart index 1cc9b6ea59..72eaf8c4ba 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_ti.dart @@ -773,6 +773,9 @@ class StringsLocalizationsTi extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -787,4 +790,7 @@ class StringsLocalizationsTi extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart b/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart index f1f9c791e2..1ad6a3afc4 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_tr.dart @@ -779,6 +779,9 @@ class StringsLocalizationsTr extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -793,4 +796,7 @@ class StringsLocalizationsTr extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart b/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart index 618559c949..2d7c8972ea 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_uk.dart @@ -781,6 +781,9 @@ class StringsLocalizationsUk extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -795,4 +798,7 @@ class StringsLocalizationsUk extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart b/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart index 7c489bcdce..cd2b74dc72 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_vi.dart @@ -775,6 +775,9 @@ class StringsLocalizationsVi extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -789,4 +792,7 @@ class StringsLocalizationsVi extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } diff --git a/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart b/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart index ae8b09a000..3390861268 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations_zh.dart @@ -740,6 +740,9 @@ class StringsLocalizationsZh extends StringsLocalizations { return 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.'; } + @override + String get youCannotShareWithYourself => 'You cannot share with yourself'; + @override String emailNoEnteAccount(Object email) { return '$email does not have an Ente account.\n\nSend them an invite to share files.'; @@ -754,6 +757,9 @@ class StringsLocalizationsZh extends StringsLocalizations { String shareTextConfirmOthersVerificationID(Object verificationID) { return 'Hey, can you confirm that this is your ente.io verification ID: $verificationID'; } + + @override + String get inviteToEnte => 'Invite to Ente'; } /// The translations for Chinese, as used in China (`zh_CN`). From 2932ee7d4cff4bb077158e57ac8abd5ead664e9b Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:52:21 +0530 Subject: [PATCH 17/19] Legacy package --- mobile/packages/legacy/analysis_options.yaml | 1 + mobile/packages/legacy/lib/ente_legacy.dart | 5 + .../legacy/lib/models/emergency_models.dart | 153 ++ .../legacy/lib/pages/emergency_page.dart | 556 +++++++ .../legacy/lib/pages/other_contact_page.dart | 287 ++++ .../lib/pages/recover_others_account.dart | 362 +++++ .../legacy/lib/pages/select_contact_page.dart | 334 ++++ .../lib/services/emergency_service.dart | 298 ++++ mobile/packages/legacy/pubspec.lock | 1366 +++++++++++++++++ mobile/packages/legacy/pubspec.yaml | 49 + mobile/packages/legacy/pubspec_overrides.yaml | 24 + .../lib/l10n/strings_localizations.dart | 12 + 12 files changed, 3447 insertions(+) create mode 100644 mobile/packages/legacy/analysis_options.yaml create mode 100644 mobile/packages/legacy/lib/ente_legacy.dart create mode 100644 mobile/packages/legacy/lib/models/emergency_models.dart create mode 100644 mobile/packages/legacy/lib/pages/emergency_page.dart create mode 100644 mobile/packages/legacy/lib/pages/other_contact_page.dart create mode 100644 mobile/packages/legacy/lib/pages/recover_others_account.dart create mode 100644 mobile/packages/legacy/lib/pages/select_contact_page.dart create mode 100644 mobile/packages/legacy/lib/services/emergency_service.dart create mode 100644 mobile/packages/legacy/pubspec.lock create mode 100644 mobile/packages/legacy/pubspec.yaml create mode 100644 mobile/packages/legacy/pubspec_overrides.yaml diff --git a/mobile/packages/legacy/analysis_options.yaml b/mobile/packages/legacy/analysis_options.yaml new file mode 100644 index 0000000000..f04c6cf0f3 --- /dev/null +++ b/mobile/packages/legacy/analysis_options.yaml @@ -0,0 +1 @@ +include: ../../analysis_options.yaml diff --git a/mobile/packages/legacy/lib/ente_legacy.dart b/mobile/packages/legacy/lib/ente_legacy.dart new file mode 100644 index 0000000000..2a47e2705c --- /dev/null +++ b/mobile/packages/legacy/lib/ente_legacy.dart @@ -0,0 +1,5 @@ +export 'models/emergency_models.dart'; +export 'pages/emergency_page.dart'; +export 'pages/other_contact_page.dart'; +export 'pages/recover_others_account.dart'; +export 'services/emergency_service.dart'; \ No newline at end of file diff --git a/mobile/packages/legacy/lib/models/emergency_models.dart b/mobile/packages/legacy/lib/models/emergency_models.dart new file mode 100644 index 0000000000..2017a3639b --- /dev/null +++ b/mobile/packages/legacy/lib/models/emergency_models.dart @@ -0,0 +1,153 @@ +import "package:ente_sharing/models/user.dart"; + +enum ContactState { + userInvitedContact, + userRevokedContact, + contactAccepted, + contactLeft, + contactDenied, + unknown, +} + +extension ContactStateExtension on ContactState { + String get stringValue { + switch (this) { + case ContactState.userInvitedContact: + return "INVITED"; + case ContactState.userRevokedContact: + return "REVOKED"; + case ContactState.contactAccepted: + return "ACCEPTED"; + case ContactState.contactLeft: + return "CONTACT_LEFT"; + case ContactState.contactDenied: + return "CONTACT_DENIED"; + default: + return "UNKNOWN"; + } + } + + static ContactState fromString(String value) { + switch (value) { + case "INVITED": + return ContactState.userInvitedContact; + case "REVOKED": + return ContactState.userRevokedContact; + case "ACCEPTED": + return ContactState.contactAccepted; + case "CONTACT_LEFT": + return ContactState.contactLeft; + case "CONTACT_DENIED": + return ContactState.contactDenied; + default: + return ContactState.unknown; + } + } +} + +class EmergencyContact { + final User user; + final User emergencyContact; + final ContactState state; + final int recoveryNoticeInDays; + + EmergencyContact( + this.user, + this.emergencyContact, + this.state, + this.recoveryNoticeInDays, + ); + + // copyWith + EmergencyContact copyWith({ + User? user, + User? emergencyContact, + ContactState? state, + int? recoveryNoticeInDays, + }) { + return EmergencyContact( + user ?? this.user, + emergencyContact ?? this.emergencyContact, + state ?? this.state, + recoveryNoticeInDays ?? this.recoveryNoticeInDays, + ); + } + + // fromJson + EmergencyContact.fromJson(Map json) + : user = User.fromMap(json['user']), + emergencyContact = User.fromMap(json['emergencyContact']), + state = ContactStateExtension.fromString(json['state'] as String), + recoveryNoticeInDays = json['recoveryNoticeInDays']; + + bool isCurrentUserContact(int userID) { + return user.id == userID; + } + + bool isPendingInvite() { + return state == ContactState.userInvitedContact; + } +} + +class EmergencyInfo { + // List of emergency contacts added by the user + final List contacts; + + // List of recovery sessions that are created to recover current user account + final List recoverSessions; + + // List of emergency contacts that have added current user as their emergency contact + final List othersEmergencyContact; + + // List of recovery sessions that are created to recover grantor's account + final List othersRecoverySession; + + EmergencyInfo( + this.contacts, + this.recoverSessions, + this.othersEmergencyContact, + this.othersRecoverySession, + ); + + // from json + EmergencyInfo.fromJson(Map json) + : contacts = (json['contacts'] as List) + .map((contact) => EmergencyContact.fromJson(contact)) + .toList(), + recoverSessions = (json['recoverSessions'] as List) + .map((session) => RecoverySessions.fromJson(session)) + .toList(), + othersEmergencyContact = (json['othersEmergencyContact'] as List) + .map((grantor) => EmergencyContact.fromJson(grantor)) + .toList(), + othersRecoverySession = (json['othersRecoverySession'] as List) + .map((session) => RecoverySessions.fromJson(session)) + .toList(); +} + +class RecoverySessions { + final String id; + final User user; + final User emergencyContact; + final String status; + final int waitTill; + final int createdAt; + + RecoverySessions( + this.id, + this.user, + this.emergencyContact, + this.status, + this.waitTill, + this.createdAt, + ); + + // fromJson + RecoverySessions.fromJson(Map json) + : id = json['id'], + user = User.fromMap(json['user']), + emergencyContact = User.fromMap(json['emergencyContact']), + status = json['status'], + waitTill = json['waitTill'], + createdAt = json['createdAt']; +} diff --git a/mobile/packages/legacy/lib/pages/emergency_page.dart b/mobile/packages/legacy/lib/pages/emergency_page.dart new file mode 100644 index 0000000000..311f600264 --- /dev/null +++ b/mobile/packages/legacy/lib/pages/emergency_page.dart @@ -0,0 +1,556 @@ +import "dart:async"; + +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_legacy/models/emergency_models.dart"; +import "package:ente_legacy/pages/other_contact_page.dart"; +import "package:ente_legacy/pages/select_contact_page.dart"; +import "package:ente_legacy/services/emergency_service.dart"; +import "package:ente_sharing/user_avator_widget.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/action_sheet_widget.dart"; +import "package:ente_ui/components/buttons/button_widget.dart"; +import "package:ente_ui/components/buttons/models/button_type.dart"; +import "package:ente_ui/components/captioned_text_widget.dart"; +import "package:ente_ui/components/divider_widget.dart"; +import "package:ente_ui/components/loading_widget.dart"; +import "package:ente_ui/components/menu_item_widget.dart"; +import "package:ente_ui/components/menu_section_title.dart"; +import "package:ente_ui/components/notification_widget.dart"; +import "package:ente_ui/components/title_bar_title_widget.dart"; +import "package:ente_ui/components/title_bar_widget.dart"; +import "package:ente_ui/theme/colors.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_ui/utils/toast_util.dart"; +import "package:ente_utils/navigation_util.dart"; +import "package:flutter/foundation.dart"; +import 'package:flutter/material.dart'; +import "package:flutter_svg/svg.dart"; + +class EmergencyPage extends StatefulWidget { + final BaseConfiguration config; + + const EmergencyPage({ + required this.config, + super.key, + }); + + @override + State createState() => _EmergencyPageState(); +} + +class _EmergencyPageState extends State { + late int currentUserID; + EmergencyInfo? info; + bool hasTrustedContact = false; + + @override + void initState() { + super.initState(); + currentUserID = widget.config.getUserID()!; + Future.delayed( + const Duration(seconds: 0), + () async { + unawaited(_fetchData()); + }, + ); + } + + Future _fetchData() async { + try { + final result = await EmergencyContactService.instance.getInfo(); + if (mounted) { + setState(() { + info = result; + if (info != null) { + hasTrustedContact = info!.contacts.isNotEmpty; + } + }); + } + } catch (e) { + showShortToast( + context, + context.strings.somethingWentWrong, + ); + } + } + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final List othersTrustedContacts = + info?.othersEmergencyContact ?? []; + final List trustedContacts = info?.contacts ?? []; + + return Scaffold( + body: CustomScrollView( + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: context.strings.legacy, + ), + ), + if (info == null) + const SliverFillRemaining( + hasScrollBody: false, + child: Center( + child: EnteLoadingWidget(), + ), + ), + if (info != null && info!.recoverSessions.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only( + top: 20, + left: 16, + right: 16, + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0) { + return Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: NotificationWidget( + startIcon: Icons.warning_amber_rounded, + text: context.strings.recoveryWarning, + actionIcon: null, + onTap: () {}, + ), + ); + } + final RecoverySessions recoverSession = + info!.recoverSessions[index - 1]; + return MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: recoverSession.emergencyContact.email, + makeTextBold: recoverSession.status.isNotEmpty, + textColor: colorScheme.warning500, + ), + leadingIconWidget: UserAvatarWidget( + recoverSession.emergencyContact, + currentUserID: currentUserID, + config: widget.config, + ), + leadingIconSize: 24, + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + trailingIcon: Icons.chevron_right, + onTap: () async { + await showRejectRecoveryDialog(recoverSession); + }, + ); + }, + childCount: 1 + info!.recoverSessions.length, + ), + ), + ), + if (info != null) + SliverPadding( + padding: const EdgeInsets.only( + top: 16, + left: 16, + right: 16, + bottom: 8, + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0 && trustedContacts.isNotEmpty) { + return MenuSectionTitle( + title: context.strings.trustedContacts, + ); + } else if (index > 0 && index <= trustedContacts.length) { + final listIndex = index - 1; + final contact = trustedContacts[listIndex]; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: contact.emergencyContact.email, + subTitle: contact.isPendingInvite() ? "⚠" : null, + makeTextBold: contact.isPendingInvite(), + ), + leadingIconSize: 24.0, + surfaceExecutionStates: false, + alwaysShowSuccessState: false, + leadingIconWidget: UserAvatarWidget( + contact.emergencyContact, + type: AvatarType.mini, + currentUserID: currentUserID, + config: widget.config, + ), + menuItemColor: + getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right, + trailingIconIsMuted: true, + onTap: () async { + await showRevokeOrRemoveDialog(context, contact); + }, + isTopBorderRadiusRemoved: listIndex > 0, + isBottomBorderRadiusRemoved: true, + singleBorderRadius: 8, + ), + DividerWidget( + dividerType: DividerType.menu, + bgColor: getEnteColorScheme(context).fillFaint, + ), + ], + ); + } else if (index == (1 + trustedContacts.length)) { + if (trustedContacts.isEmpty) { + return Column( + children: [ + const SizedBox(height: 20), + Text( + context.strings.legacyPageDesc, + style: getEnteTextTheme(context).body, + ), + SizedBox( + height: 200, + width: 200, + child: SvgPicture.asset( + getEnteColorScheme(context).backdropBase == + backgroundBaseDark + ? "assets/icons/legacy-light.svg" + : "assets/icons/legacy-dark.svg", + width: 156, + height: 152, + ), + ), + Text( + context.strings.legacyPageDesc2, + style: getEnteTextTheme(context).smallMuted, + ), + const SizedBox(height: 16), + ButtonWidget( + buttonType: ButtonType.primary, + labelText: context.strings.addTrustedContact, + shouldSurfaceExecutionStates: false, + onTap: () async { + await routeToPage( + context, + AddContactPage( + info!, + config: widget.config, + ), + forceCustomPageRoute: true, + ); + unawaited(_fetchData()); + }, + ), + ], + ); + } + return MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: trustedContacts.isNotEmpty + ? context.strings.addMore + : context.strings.addTrustedContact, + makeTextBold: true, + ), + leadingIcon: Icons.add_outlined, + surfaceExecutionStates: false, + menuItemColor: getEnteColorScheme(context).fillFaint, + onTap: () async { + await routeToPage( + context, + AddContactPage( + info!, + config: widget.config, + ), + forceCustomPageRoute: true, + ); + unawaited(_fetchData()); + }, + isTopBorderRadiusRemoved: trustedContacts.isNotEmpty, + singleBorderRadius: 8, + ); + } + return const SizedBox.shrink(); + }, + childCount: 1 + trustedContacts.length + 1, + ), + ), + ), + if (info != null && info!.othersEmergencyContact.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 0, left: 16, right: 16), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0 && (othersTrustedContacts.isNotEmpty)) { + return Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: DividerWidget( + dividerType: DividerType.solid, + ), + ), + MenuSectionTitle( + title: context.strings.legacyAccounts, + ), + ], + ); + } else if (index > 0 && + index <= othersTrustedContacts.length) { + final listIndex = index - 1; + final currentUser = othersTrustedContacts[listIndex]; + final isLastItem = index == othersTrustedContacts.length; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: currentUser.user.email, + makeTextBold: currentUser.isPendingInvite(), + subTitle: + currentUser.isPendingInvite() ? "⚠" : null, + ), + leadingIconSize: 24.0, + leadingIconWidget: UserAvatarWidget( + currentUser.user, + type: AvatarType.mini, + currentUserID: currentUserID, + config: widget.config, + ), + menuItemColor: + getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right, + trailingIconIsMuted: true, + onTap: () async { + if (currentUser.isPendingInvite()) { + await showAcceptOrDeclineDialog( + context, + currentUser, + ); + } else { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return OtherContactPage( + contact: currentUser, + emergencyInfo: info!, + config: widget.config, + ); + }, + ), + ); + if (mounted) { + unawaited(_fetchData()); + } + } + }, + isTopBorderRadiusRemoved: listIndex > 0, + isBottomBorderRadiusRemoved: !isLastItem, + singleBorderRadius: 8, + surfaceExecutionStates: false, + ), + isLastItem + ? const SizedBox.shrink() + : DividerWidget( + dividerType: DividerType.menu, + bgColor: + getEnteColorScheme(context).fillFaint, + ), + ], + ); + } + return const SizedBox.shrink(); + }, + childCount: 1 + othersTrustedContacts.length + 1, + ), + ), + ), + ], + ), + ); + } + + Future showRevokeOrRemoveDialog( + BuildContext context, + EmergencyContact contact, + ) async { + if (contact.isPendingInvite()) { + await showActionSheet( + context: context, + body: + "You have invited ${contact.emergencyContact.email} to be a trusted contact", + bodyHighlight: "They are yet to accept your invite", + buttons: [ + ButtonWidget( + labelText: "context.strings.removeInvite", + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.first, + shouldStickToDarkTheme: true, + shouldSurfaceExecutionStates: true, + shouldShowSuccessConfirmation: false, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.userRevokedContact); + info?.contacts.remove(contact); + if (mounted) { + setState(() {}); + unawaited(_fetchData()); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + ); + } else { + await showActionSheet( + context: context, + body: + "You have added ${contact.emergencyContact.email} as a trusted contact", + bodyHighlight: "They have accepted your invite", + buttons: [ + ButtonWidget( + labelText: "context.strings.remove", + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + shouldSurfaceExecutionStates: true, + shouldShowSuccessConfirmation: false, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.userRevokedContact); + info?.contacts.remove(contact); + if (mounted) { + setState(() {}); + unawaited(_fetchData()); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + ); + } + } + + Future showAcceptOrDeclineDialog( + BuildContext context, + EmergencyContact contact, + ) async { + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: "context.strings.acceptTrustInvite", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.first, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.contactAccepted); + final updatedContact = + contact.copyWith(state: ContactState.contactAccepted); + info?.othersEmergencyContact.remove(contact); + info?.othersEmergencyContact.add(updatedContact); + if (mounted) { + setState(() {}); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.declineTrustInvite, + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.contactDenied); + info?.othersEmergencyContact.remove(contact); + if (mounted) { + setState(() {}); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: "context.strings.legacyInvite(email: contact.user.email)", + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } + + Future showRejectRecoveryDialog(RecoverySessions session) async { + final String emergencyContactEmail = session.emergencyContact.email; + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: context.strings.rejectRecovery, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonType: ButtonType.critical, + buttonAction: ButtonAction.first, + onTap: () async { + await EmergencyContactService.instance.rejectRecovery(session); + info?.recoverSessions + .removeWhere((element) => element.id == session.id); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), + if (kDebugMode) + ButtonWidget( + labelText: "Approve recovery (to be removed)", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance.approveRecovery(session); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: context.strings.recoveryWarningBody(emergencyContactEmail), + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } +} diff --git a/mobile/packages/legacy/lib/pages/other_contact_page.dart b/mobile/packages/legacy/lib/pages/other_contact_page.dart new file mode 100644 index 0000000000..d1830b41cd --- /dev/null +++ b/mobile/packages/legacy/lib/pages/other_contact_page.dart @@ -0,0 +1,287 @@ +import "dart:async"; + +import "package:collection/collection.dart"; +import "package:ente_base/models/key_attributes.dart"; +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_legacy/models/emergency_models.dart"; +import "package:ente_legacy/pages/recover_others_account.dart"; +import "package:ente_legacy/services/emergency_service.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/action_sheet_widget.dart"; +import "package:ente_ui/components/buttons/button_widget.dart"; +import "package:ente_ui/components/buttons/models/button_type.dart"; +import "package:ente_ui/components/captioned_text_widget.dart"; +import "package:ente_ui/components/menu_item_widget.dart"; +import "package:ente_ui/components/menu_section_title.dart"; +import "package:ente_ui/components/title_bar_title_widget.dart"; +import "package:ente_ui/theme/colors.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_ui/utils/dialog_util.dart"; +import "package:ente_utils/navigation_util.dart"; +import "package:flutter/material.dart"; +import "package:intl/intl.dart"; +import "package:logging/logging.dart"; + +// OtherContactPage is used to start recovery process for other user's account +// Based on the state of the contact & recovery session, it will show +// different UI +class OtherContactPage extends StatefulWidget { + final EmergencyContact contact; + final EmergencyInfo emergencyInfo; + final BaseConfiguration config; + + const OtherContactPage({ + required this.contact, + required this.emergencyInfo, + required this.config, + super.key, + }); + + @override + State createState() => _OtherContactPageState(); +} + +class _OtherContactPageState extends State { + late String accountEmail = widget.contact.user.email; + RecoverySessions? recoverySession; + String? waitTill; + final Logger _logger = Logger("_OtherContactPageState"); + late EmergencyInfo emergencyInfo = widget.emergencyInfo; + + @override + void initState() { + super.initState(); + recoverySession = widget.emergencyInfo.othersRecoverySession + .firstWhereOrNull((session) => session.user.email == accountEmail); + _fetchData(); + } + + Future _fetchData() async { + try { + final result = await EmergencyContactService.instance.getInfo(); + if (mounted) { + setState(() { + recoverySession = result.othersRecoverySession.firstWhereOrNull( + (session) => session.user.email == accountEmail, + ); + }); + } + } catch (e) { + _logger.severe("Error fetching data", e); + } + } + + @override + Widget build(BuildContext context) { + _logger.info('session ${widget.emergencyInfo}'); + if (recoverySession != null) { + final dateTime = DateTime.now().add( + Duration( + microseconds: recoverySession!.waitTill, + ), + ); + waitTill = _getFormattedTime(context, dateTime); + } + final colorScheme = getEnteColorScheme(context); + final textTheme = getEnteTextTheme(context); + return Scaffold( + appBar: AppBar(), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 12), + TitleBarTitleWidget( + title: context.strings.recoverAccount, + ), + Text( + accountEmail, + textAlign: TextAlign.left, + style: + textTheme.small.copyWith(color: colorScheme.textMuted), + ), + ], + ), + ), + const SizedBox(height: 12), + recoverySession == null + ? Text( + "You can recover $accountEmail's account in ${widget.contact.recoveryNoticeInDays} days" + " after starting the recovery process.", + style: textTheme.body, + ) + : (recoverySession!.status == "READY" + ? Text( + "Recovery ready for $accountEmail", + style: textTheme.body, + ) + : Text( + "You can recover $accountEmail's" + " account after $waitTill.", + style: textTheme.bodyBold, + )), + const SizedBox(height: 24), + if (recoverySession == null) + ButtonWidget( + // icon: Icons.start_outlined, + buttonType: ButtonType.trailingIconPrimary, + icon: Icons.start_outlined, + labelText: context.strings.startAccountRecoveryTitle, + onTap: widget.contact.isPendingInvite() + ? null + : () async { + final actionResult = await showChoiceActionSheet( + context, + title: context.strings.startAccountRecoveryTitle, + firstButtonLabel: context.strings.yes, + body: "Are you sure you want to initiate recovery?", + isCritical: true, + ); + if (actionResult?.action != null) { + if (actionResult!.action == ButtonAction.first) { + try { + await EmergencyContactService.instance + .startRecovery(widget.contact); + if (mounted) { + _fetchData().ignore(); + await showErrorDialog( + context, + context.strings.recoveryInitiated, + context.strings.recoveryInitiatedDesc( + widget.contact.recoveryNoticeInDays, + widget.config.getEmail()!, + ), + ); + } + } catch (e) { + showGenericErrorDialog(context: context, error: e) + .ignore(); + } + } + } + }, + ), + if (recoverySession != null && recoverySession!.status == "READY") + Padding( + padding: const EdgeInsets.only(bottom: 12.0), + child: ButtonWidget( + buttonType: ButtonType.primary, + labelText: context.strings.recoverAccount, + onTap: () async { + try { + final (String key, KeyAttributes attributes) = + await EmergencyContactService.instance + .getRecoveryInfo(recoverySession!); + routeToPage( + context, + RecoverOthersAccount(key, attributes, recoverySession!), + ).ignore(); + } catch (e) { + showGenericErrorDialog(context: context, error: e) + .ignore(); + } + }, + ), + ), + if (recoverySession != null && + (recoverySession!.status == "WAITING" || + recoverySession!.status == "READY")) + ButtonWidget( + buttonType: ButtonType.neutral, + labelText: context.strings.cancelAccountRecovery, + shouldSurfaceExecutionStates: false, + onTap: () async { + final actionResult = await showChoiceActionSheet( + context, + title: context.strings.cancelAccountRecovery, + firstButtonLabel: context.strings.yes, + body: context.strings.cancelAccountRecoveryBody, + isCritical: true, + firstButtonOnTap: () async { + await EmergencyContactService.instance + .stopRecovery(recoverySession!); + }, + ); + if (actionResult?.action == ButtonAction.first) { + _fetchData().ignore(); + } + }, + ), + MenuSectionTitle( + title: context.strings.removeYourselfAsTrustedContact, + ), + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: context.strings.remove, + textColor: warning500, + makeTextBold: true, + ), + leadingIcon: Icons.not_interested_outlined, + leadingIconColor: warning500, + menuItemColor: getEnteColorScheme(context).fillFaint, + surfaceExecutionStates: false, + onTap: () async { + await showRemoveSheet(); + }, + ), + ], + ), + ), + ); + } + + String _getFormattedTime(BuildContext context, DateTime dateTime) { + return DateFormat( + 'E, MMM d, y - HH:mm', + Localizations.localeOf(context).languageCode, + ).format( + dateTime, + ); + } + + Future showRemoveSheet() async { + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: context.strings.remove, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonType: ButtonType.critical, + buttonAction: ButtonAction.first, + onTap: () async { + try { + await EmergencyContactService.instance.updateContact( + widget.contact, + ContactState.contactLeft, + ); + Navigator.of(context).pop(); + } catch (e) { + showGenericErrorDialog(context: context, error: e).ignore(); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: context.strings.cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: "Are you sure your want to stop being a trusted " + "contact for $accountEmail?", + title: context.strings.remove, + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } +} diff --git a/mobile/packages/legacy/lib/pages/recover_others_account.dart b/mobile/packages/legacy/lib/pages/recover_others_account.dart new file mode 100644 index 0000000000..6e847ab544 --- /dev/null +++ b/mobile/packages/legacy/lib/pages/recover_others_account.dart @@ -0,0 +1,362 @@ +import "dart:convert"; +import "dart:typed_data"; + +import "package:ente_accounts/models/set_keys_request.dart"; +import "package:ente_base/models/key_attributes.dart"; +import "package:ente_crypto_dart/ente_crypto_dart.dart"; +import "package:ente_legacy/models/emergency_models.dart"; +import "package:ente_legacy/services/emergency_service.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/buttons/dynamic_fab.dart"; +import "package:ente_ui/utils/dialog_util.dart"; +import "package:flutter/material.dart"; +import "package:flutter/services.dart"; +import "package:logging/logging.dart"; +import "package:password_strength/password_strength.dart"; + +class RecoverOthersAccount extends StatefulWidget { + final String recoveryKey; + final KeyAttributes attributes; + final RecoverySessions sessions; + + const RecoverOthersAccount( + this.recoveryKey, + this.attributes, + this.sessions, { + super.key, + }); + + @override + State createState() => _RecoverOthersAccountState(); +} + +class _RecoverOthersAccountState extends State { + static const kMildPasswordStrengthThreshold = 0.4; + static const kStrongPasswordStrengthThreshold = 0.7; + + final _logger = Logger((_RecoverOthersAccountState).toString()); + final _passwordController1 = TextEditingController(), + _passwordController2 = TextEditingController(); + final Color _validFieldValueColor = const Color.fromRGBO(45, 194, 98, 0.2); + String _passwordInInputBox = ''; + String _passwordInInputConfirmationBox = ''; + double _passwordStrength = 0.0; + bool _password1Visible = false; + bool _password2Visible = false; + final _password1FocusNode = FocusNode(); + final _password2FocusNode = FocusNode(); + bool _password1InFocus = false; + bool _password2InFocus = false; + + bool _passwordsMatch = false; + bool _isPasswordValid = false; + + @override + void initState() { + super.initState(); + _password1FocusNode.addListener(() { + setState(() { + _password1InFocus = _password1FocusNode.hasFocus; + }); + }); + _password2FocusNode.addListener(() { + setState(() { + _password2InFocus = _password2FocusNode.hasFocus; + }); + }); + } + + @override + Widget build(BuildContext context) { + final isKeypadOpen = MediaQuery.of(context).viewInsets.bottom > 100; + + FloatingActionButtonLocation? fabLocation() { + if (isKeypadOpen) { + return null; + } else { + return FloatingActionButtonLocation.centerFloat; + } + } + + String title = context.strings.setPasswordTitle; + title = context.strings.resetPasswordTitle; + return Scaffold( + resizeToAvoidBottomInset: isKeypadOpen, + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back), + color: Theme.of(context).iconTheme.color, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + elevation: 0, + ), + body: _getBody(title), + floatingActionButton: DynamicFAB( + isKeypadOpen: isKeypadOpen, + isFormValid: _passwordsMatch && _isPasswordValid, + buttonText: title, + onPressedFunction: () { + _updatePassword(); + FocusScope.of(context).unfocus(); + }, + ), + floatingActionButtonLocation: fabLocation(), + floatingActionButtonAnimator: NoScalingAnimation(), + ); + } + + Widget _getBody(String buttonTextAndHeading) { + final email = widget.sessions.user.email; + var passwordStrengthText = context.strings.weakStrength; + var passwordStrengthColor = Colors.redAccent; + if (_passwordStrength > kStrongPasswordStrengthThreshold) { + passwordStrengthText = context.strings.strongStrength; + passwordStrengthColor = Colors.greenAccent; + } else if (_passwordStrength > kMildPasswordStrengthThreshold) { + passwordStrengthText = context.strings.moderateStrength; + passwordStrengthColor = Colors.orangeAccent; + } + return Column( + children: [ + Expanded( + child: AutofillGroup( + child: ListView( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(vertical: 30, horizontal: 20), + child: Text( + buttonTextAndHeading, + style: Theme.of(context).textTheme.headlineMedium, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + "Enter new password for $email account. You will be able " + "to use this password to login into $email account.", + textAlign: TextAlign.start, + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(fontSize: 14), + ), + ), + const Padding(padding: EdgeInsets.all(12)), + Visibility( + // hidden textForm for suggesting auto-fill service for saving + // password + visible: false, + child: TextFormField( + autofillHints: const [ + AutofillHints.email, + ], + autocorrect: false, + keyboardType: TextInputType.emailAddress, + initialValue: email, + textInputAction: TextInputAction.next, + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), + child: TextFormField( + autofillHints: const [AutofillHints.newPassword], + decoration: InputDecoration( + fillColor: + _isPasswordValid ? _validFieldValueColor : null, + filled: true, + hintText: context.strings.password, + contentPadding: const EdgeInsets.all(20), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(6), + ), + suffixIcon: _password1InFocus + ? IconButton( + icon: Icon( + _password1Visible + ? Icons.visibility + : Icons.visibility_off, + color: Theme.of(context).iconTheme.color, + size: 20, + ), + onPressed: () { + setState(() { + _password1Visible = !_password1Visible; + }); + }, + ) + : null, + ), + obscureText: !_password1Visible, + controller: _passwordController1, + autofocus: false, + autocorrect: false, + keyboardType: TextInputType.visiblePassword, + onChanged: (password) { + setState(() { + _passwordInInputBox = password; + _passwordStrength = estimatePasswordStrength(password); + _isPasswordValid = + _passwordStrength >= kMildPasswordStrengthThreshold; + _passwordsMatch = _passwordInInputBox == + _passwordInInputConfirmationBox; + }); + }, + textInputAction: TextInputAction.next, + focusNode: _password1FocusNode, + ), + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), + child: TextFormField( + keyboardType: TextInputType.visiblePassword, + controller: _passwordController2, + obscureText: !_password2Visible, + autofillHints: const [AutofillHints.newPassword], + onEditingComplete: () => TextInput.finishAutofillContext(), + decoration: InputDecoration( + fillColor: _passwordsMatch ? _validFieldValueColor : null, + filled: true, + hintText: context.strings.confirmPassword, + contentPadding: const EdgeInsets.symmetric( + vertical: 20, + horizontal: 20, + ), + suffixIcon: _password2InFocus + ? IconButton( + icon: Icon( + _password2Visible + ? Icons.visibility + : Icons.visibility_off, + color: Theme.of(context).iconTheme.color, + size: 20, + ), + onPressed: () { + setState(() { + _password2Visible = !_password2Visible; + }); + }, + ) + : null, + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(6), + ), + ), + focusNode: _password2FocusNode, + onChanged: (cnfPassword) { + setState(() { + _passwordInInputConfirmationBox = cnfPassword; + if (_passwordInInputBox != '') { + _passwordsMatch = _passwordInInputBox == + _passwordInInputConfirmationBox; + } + }); + }, + ), + ), + Opacity( + opacity: + (_passwordInInputBox != '') && _password1InFocus ? 1 : 0, + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + child: Text( + "Password strength: $passwordStrengthText", + style: TextStyle( + color: passwordStrengthColor, + ), + ), + ), + ), + const SizedBox(height: 8), + const Padding(padding: EdgeInsets.all(20)), + ], + ), + ), + ), + ], + ); + } + + void _updatePassword() async { + final dialog = createProgressDialog( + context, + context.strings.generatingEncryptionKeys, + ); + await dialog.show(); + try { + final String password = _passwordController1.text; + final KeyAttributes attributes = widget.attributes; + Uint8List? masterKey; + try { + // Decrypt the master key that was earlier encrypted with the recovery key + masterKey = await CryptoUtil.decrypt( + CryptoUtil.base642bin(attributes.masterKeyEncryptedWithRecoveryKey), + CryptoUtil.hex2bin(widget.recoveryKey), + CryptoUtil.base642bin(attributes.masterKeyDecryptionNonce), + ); + } catch (e) { + _logger.severe(e, "Failed to get master key using recoveryKey"); + rethrow; + } + + // Derive a key from the password that will be used to encrypt and + // decrypt the master key + final kekSalt = CryptoUtil.getSaltToDeriveKey(); + final derivedKeyResult = await CryptoUtil.deriveSensitiveKey( + utf8.encode(password), + kekSalt, + ); + final loginKey = await CryptoUtil.deriveLoginKey(derivedKeyResult.key); + // Encrypt the key with this derived key + final encryptedKeyData = + CryptoUtil.encryptSync(masterKey, derivedKeyResult.key); + + final updatedAttributes = attributes.copyWith( + kekSalt: CryptoUtil.bin2base64(kekSalt), + encryptedKey: CryptoUtil.bin2base64(encryptedKeyData.encryptedData!), + keyDecryptionNonce: CryptoUtil.bin2base64(encryptedKeyData.nonce!), + memLimit: derivedKeyResult.memLimit, + opsLimit: derivedKeyResult.opsLimit, + ); + final setKeyRequest = SetKeysRequest( + kekSalt: updatedAttributes.kekSalt, + encryptedKey: updatedAttributes.encryptedKey, + keyDecryptionNonce: updatedAttributes.keyDecryptionNonce, + memLimit: updatedAttributes.memLimit, + opsLimit: updatedAttributes.opsLimit, + ); + await EmergencyContactService.instance.changePasswordForOther( + Uint8List.fromList(loginKey), + setKeyRequest, + widget.sessions, + ); + await dialog.hide(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(context.strings.passwordChangedSuccessfully), + backgroundColor: Colors.green, + ), + ); + Navigator.of(context).pop(); + } catch (e, s) { + _logger.severe(e, s); + await dialog.hide(); + await showGenericErrorDialog(context: context, error: e); + } + } + + @override + void dispose() { + _passwordController1.dispose(); + _passwordController2.dispose(); + _password1FocusNode.dispose(); + _password2FocusNode.dispose(); + super.dispose(); + } +} diff --git a/mobile/packages/legacy/lib/pages/select_contact_page.dart b/mobile/packages/legacy/lib/pages/select_contact_page.dart new file mode 100644 index 0000000000..58fc9cefd2 --- /dev/null +++ b/mobile/packages/legacy/lib/pages/select_contact_page.dart @@ -0,0 +1,334 @@ +import "package:email_validator/email_validator.dart"; +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_legacy/models/emergency_models.dart"; +import "package:ente_legacy/services/emergency_service.dart"; +import "package:ente_sharing/models/user.dart"; +import "package:ente_sharing/verify_identity_dialog.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/buttons/button_widget.dart"; +import "package:ente_ui/components/buttons/models/button_type.dart"; +import "package:ente_ui/components/captioned_text_widget.dart"; +import "package:ente_ui/components/divider_widget.dart"; +import "package:ente_ui/components/menu_item_widget.dart"; +import "package:ente_ui/components/menu_section_description_widget.dart"; +import "package:ente_ui/components/menu_section_title.dart"; +import "package:ente_ui/theme/ente_theme.dart"; +import "package:ente_ui/utils/dialog_util.dart"; +import "package:flutter/material.dart"; +import "package:logging/logging.dart"; + +class AddContactPage extends StatefulWidget { + final EmergencyInfo emergencyInfo; + final BaseConfiguration config; + + const AddContactPage( + this.emergencyInfo, { + super.key, + required this.config, + }); + + @override + State createState() => _AddContactPageState(); +} + +class _AddContactPageState extends State { + String selectedEmail = ''; + String _email = ''; + bool isEmailListEmpty = false; + bool _emailIsValid = false; + bool isKeypadOpen = false; + late final Logger _logger = Logger('AddContactPage'); + + // Focus nodes are necessary + final textFieldFocusNode = FocusNode(); + final _textController = TextEditingController(); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + _textController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + isKeypadOpen = MediaQuery.of(context).viewInsets.bottom > 100; + final colorScheme = getEnteColorScheme(context); + final textTheme = getEnteTextTheme(context); + final List suggestedUsers = _getSuggestedUser(); + isEmailListEmpty = suggestedUsers.isEmpty; + + return Scaffold( + resizeToAvoidBottomInset: isKeypadOpen, + appBar: AppBar( + title: Text( + context.strings.addTrustedContact, + ), + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + context.strings.addANewEmail, + style: textTheme.small.copyWith(color: colorScheme.textMuted), + ), + ), + const SizedBox(height: 4), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: _getEmailField(), + ), + if (isEmailListEmpty) + const Expanded(child: SizedBox.shrink()) + else + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: [ + !isEmailListEmpty + ? MenuSectionTitle( + title: context.strings.orPickAnExistingOne, + ) + : const SizedBox.shrink(), + Expanded( + child: ListView.builder( + itemBuilder: (context, index) { + if (index >= suggestedUsers.length) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + ), + child: MenuSectionDescriptionWidget( + content: context.strings.whyAddTrustContact, + ), + ); + } + final currentUser = suggestedUsers[index]; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: currentUser.email, + ), + leadingIconSize: 24.0, + leadingIconWidget: CircleAvatar( + radius: 12, + child: Text( + currentUser.email + .substring(0, 1) + .toUpperCase(), + style: const TextStyle(fontSize: 12), + ), + ), + menuItemColor: colorScheme.fillFaint, + pressedColor: colorScheme.fillFaint, + trailingIcon: + (selectedEmail == currentUser.email) + ? Icons.check + : null, + onTap: () async { + textFieldFocusNode.unfocus(); + if (selectedEmail == currentUser.email) { + selectedEmail = ''; + } else { + selectedEmail = currentUser.email; + } + setState(() {}); + }, + isTopBorderRadiusRemoved: index > 0, + isBottomBorderRadiusRemoved: + index < (suggestedUsers.length - 1), + ), + (index == (suggestedUsers.length - 1)) + ? const SizedBox.shrink() + : DividerWidget( + dividerType: DividerType.menu, + bgColor: colorScheme.fillFaint, + ), + ], + ); + }, + itemCount: suggestedUsers.length + 1, + ), + ), + ], + ), + ), + ), + SafeArea( + child: Padding( + padding: const EdgeInsets.only( + top: 8, + bottom: 8, + left: 16, + right: 16, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + labelText: "Add", + isDisabled: (selectedEmail == '' && !_emailIsValid), + onTap: (selectedEmail == '' && !_emailIsValid) + ? null + : () async { + final emailToAdd = + selectedEmail == '' ? _email : selectedEmail; + final choiceResult = await showChoiceActionSheet( + context, + title: context.strings.warning, + body: context.strings.confirmAddingTrustedContact( + emailToAdd, + 30, + ), + firstButtonLabel: context.strings.proceed, + isCritical: true, + ); + if (choiceResult != null && + choiceResult.action == ButtonAction.first) { + try { + final r = await EmergencyContactService.instance + .addContact(context, emailToAdd); + if (r && mounted) { + Navigator.of(context).pop(true); + } + } catch (e) { + _logger.severe('Failed to add contact', e); + await showErrorDialog( + context, + context.strings.error, + context.strings.somethingWentWrong, + ); + } + } + }, + ), + const SizedBox(height: 12), + GestureDetector( + onTap: () async { + if ((selectedEmail == '' && !_emailIsValid)) { + await showErrorDialog( + context, + context.strings.invalidEmailAddress, + context.strings.enterValidEmail, + ); + return; + } + final emailToAdd = + selectedEmail == '' ? _email : selectedEmail; + await showDialog( + context: context, + builder: (BuildContext context) { + return VerifyIdentityDialog( + self: false, + email: emailToAdd, + config: widget.config, + ); + }, + ); + }, + child: Text( + context.strings.verifyIDLabel, + textAlign: TextAlign.center, + style: textTheme.smallMuted.copyWith( + decoration: TextDecoration.underline, + ), + ), + ), + const SizedBox(height: 12), + ], + ), + ), + ), + ], + ), + ); + } + + void clearFocus() { + _textController.clear(); + _email = _textController.text; + _emailIsValid = false; + textFieldFocusNode.unfocus(); + setState(() {}); + } + + Widget _getEmailField() { + final colorScheme = getEnteColorScheme(context); + return TextFormField( + controller: _textController, + focusNode: textFieldFocusNode, + autofillHints: const [AutofillHints.email], + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all(Radius.circular(4.0)), + borderSide: BorderSide(color: colorScheme.strokeMuted), + ), + fillColor: colorScheme.fillFaint, + filled: true, + hintText: context.strings.enterEmail, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(4), + ), + prefixIcon: Icon( + Icons.email_outlined, + color: colorScheme.strokeMuted, + ), + suffixIcon: _email == '' + ? null + : IconButton( + onPressed: clearFocus, + icon: Icon( + Icons.cancel, + color: colorScheme.strokeMuted, + ), + ), + ), + onChanged: (value) { + if (selectedEmail != '') { + selectedEmail = ''; + } + _email = value.trim(); + _emailIsValid = EmailValidator.validate(_email); + setState(() {}); + }, + autocorrect: false, + keyboardType: TextInputType.emailAddress, + textInputAction: TextInputAction.next, + ); + } + + List _getSuggestedUser() { + final List suggestedUsers = []; + // For now, return an empty list since we don't have access to CollectionsService + // In a real implementation, this would fetch users from shared collections + + if (_textController.text.trim().isNotEmpty) { + suggestedUsers.removeWhere( + (element) => !element.email + .toLowerCase() + .contains(_textController.text.trim().toLowerCase()), + ); + } + suggestedUsers.sort((a, b) => a.email.compareTo(b.email)); + + return suggestedUsers; + } +} diff --git a/mobile/packages/legacy/lib/services/emergency_service.dart b/mobile/packages/legacy/lib/services/emergency_service.dart new file mode 100644 index 0000000000..6bc48c2b3c --- /dev/null +++ b/mobile/packages/legacy/lib/services/emergency_service.dart @@ -0,0 +1,298 @@ +import "dart:convert"; +import "dart:math"; +import "dart:typed_data"; + +import "package:dio/dio.dart"; +import "package:ente_accounts/models/set_keys_request.dart"; +import "package:ente_accounts/models/srp.dart"; +import "package:ente_accounts/services/user_service.dart"; +import "package:ente_base/models/key_attributes.dart"; +import "package:ente_configuration/base_configuration.dart"; +import "package:ente_crypto_dart/ente_crypto_dart.dart"; +import "package:ente_legacy/models/emergency_models.dart"; +import "package:ente_network/network.dart"; +import "package:ente_strings/ente_strings.dart"; +import "package:ente_ui/components/user_dialogs.dart"; +import "package:ente_utils/email_util.dart"; +import "package:flutter/material.dart"; +import "package:logging/logging.dart"; +import "package:pointycastle/pointycastle.dart"; +import "package:pointycastle/random/fortuna_random.dart"; +import "package:pointycastle/srp/srp6_client.dart"; +import "package:pointycastle/srp/srp6_standard_groups.dart"; +import "package:pointycastle/srp/srp6_util.dart"; +import "package:pointycastle/srp/srp6_verifier_generator.dart"; +import "package:uuid/uuid.dart"; + +class EmergencyContactService { + final Dio _enteDio = Network.instance.enteDio; + late UserService _userService; + late BaseConfiguration _config; + late final Logger _logger = Logger("EmergencyContactService"); + + EmergencyContactService._privateConstructor(); + static final EmergencyContactService instance = + EmergencyContactService._privateConstructor(); + + Future init( + UserService userService, + BaseConfiguration config, + ) async { + _userService = userService; + _config = config; + } + + Future addContact(BuildContext context, String email) async { + if (!isValidEmail(email)) { + await showErrorDialog( + context, + context.strings.invalidEmailAddress, + context.strings.enterValidEmail, + ); + return false; + } else if (email.trim() == _config.getEmail()) { + await showErrorDialog( + context, + context.strings.oops, + context.strings.youCannotShareWithYourself, + ); + return false; + } + final String? publicKey = await _userService.getPublicKey(email); + if (publicKey == null) { + await showInviteDialog(context, email); + return false; + } + final Uint8List recoveryKey = _config.getRecoveryKey(); + final encryptedKey = CryptoUtil.sealSync( + recoveryKey, + CryptoUtil.base642bin(publicKey), + ); + await _enteDio.post( + "/emergency-contacts/add", + data: { + "email": email.trim(), + "encryptedKey": CryptoUtil.bin2base64(encryptedKey), + }, + ); + return true; + } + + Future getInfo() async { + try { + final response = await _enteDio.get("/emergency-contacts/info"); + return EmergencyInfo.fromJson(response.data); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to get info', e, s); + rethrow; + } + } + + Future updateContact( + EmergencyContact contact, + ContactState state, + ) async { + try { + await _enteDio.post( + "/emergency-contacts/update", + data: { + "userID": contact.user.id, + "emergencyContactID": contact.emergencyContact.id, + "state": state.stringValue, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to update contact', e, s); + rethrow; + } + } + + Future startRecovery(EmergencyContact contact) async { + try { + await _enteDio.post( + "/emergency-contacts/start-recovery", + data: { + "userID": contact.user.id, + "emergencyContactID": contact.emergencyContact.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to start recovery', e, s); + rethrow; + } + } + + Future stopRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/stop-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future rejectRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/reject-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future approveRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/approve-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to approve recovery', e, s); + rethrow; + } + } + + Future<(String, KeyAttributes)> getRecoveryInfo( + RecoverySessions sessions, + ) async { + try { + final resp = await _enteDio.get( + "/emergency-contacts/recovery-info/${sessions.id}", + ); + final String encryptedKey = resp.data["encryptedKey"]!; + final decryptedKey = CryptoUtil.openSealSync( + CryptoUtil.base642bin(encryptedKey), + CryptoUtil.base642bin(_config.getKeyAttributes()!.publicKey), + _config.getSecretKey()!, + ); + final String hexRecoveryKey = CryptoUtil.bin2hex(decryptedKey); + final KeyAttributes keyAttributes = + KeyAttributes.fromMap(resp.data['userKeyAttr']); + return (hexRecoveryKey, keyAttributes); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future changePasswordForOther( + Uint8List loginKey, + SetKeysRequest setKeysRequest, + RecoverySessions recoverySessions, + ) async { + try { + final SRP6GroupParameters kDefaultSrpGroup = + SRP6StandardGroups.rfc5054_4096; + final String username = const Uuid().v4().toString(); + final SecureRandom random = _getSecureRandom(); + final Uint8List identity = Uint8List.fromList(utf8.encode(username)); + final Uint8List password = loginKey; + final Uint8List salt = random.nextBytes(16); + final gen = SRP6VerifierGenerator( + group: kDefaultSrpGroup, + digest: Digest('SHA-256'), + ); + final v = gen.generateVerifier(salt, identity, password); + + final client = SRP6Client( + group: kDefaultSrpGroup, + digest: Digest('SHA-256'), + random: random, + ); + + final A = client.generateClientCredentials(salt, identity, password); + final request = SetupSRPRequest( + srpUserID: username, + srpSalt: base64Encode(salt), + srpVerifier: base64Encode(SRP6Util.encodeBigInt(v)), + srpA: base64Encode(SRP6Util.encodeBigInt(A!)), + isUpdate: false, + ); + final response = await _enteDio.post( + "/emergency-contacts/init-change-password", + data: { + "recoveryID": recoverySessions.id, + "setupSRPRequest": request.toMap(), + }, + ); + if (response.statusCode == 200) { + final SetupSRPResponse setupSRPResponse = + SetupSRPResponse.fromJson(response.data); + final serverB = + SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); + + // ignore: unused_local_variable + final clientS = client.calculateSecret(serverB); + final clientM = client.calculateClientEvidenceMessage(); + // ignore: unused_local_variable + late Response srpCompleteResponse; + srpCompleteResponse = await _enteDio.post( + "/emergency-contacts/change-password", + data: { + "recoveryID": recoverySessions.id, + 'updateSrpAndKeysRequest': { + 'setupID': setupSRPResponse.setupID, + 'srpM1': base64Encode(SRP6Util.encodeBigInt(clientM!)), + 'updatedKeyAttr': setKeysRequest.toMap(), + }, + }, + ); + } else { + throw Exception("register-srp action failed"); + } + } catch (e, s) { + _logger.severe("failed to change password for other", e, s); + rethrow; + } + } + + SecureRandom _getSecureRandom() { + final List seeds = []; + final random = Random.secure(); + for (int i = 0; i < 32; i++) { + seeds.add(random.nextInt(255)); + } + final secureRandom = FortunaRandom(); + secureRandom.seed(KeyParameter(Uint8List.fromList(seeds))); + return secureRandom; + } + + // Helper methods for dialogs + Future showErrorDialog( + BuildContext context, + String title, + String message, + ) async { + return showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(title), + content: Text(message), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } +} diff --git a/mobile/packages/legacy/pubspec.lock b/mobile/packages/legacy/pubspec.lock new file mode 100644 index 0000000000..6c7ffdbb7b --- /dev/null +++ b/mobile/packages/legacy/pubspec.lock @@ -0,0 +1,1366 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + bip39: + dependency: transitive + description: + name: bip39 + sha256: de1ee27ebe7d96b84bb3a04a4132a0a3007dcdd5ad27dd14aa87a29d97c45edc + url: "https://pub.dev" + source: hosted + version: "1.0.6" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: "direct main" + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cronet_http: + dependency: transitive + description: + name: cronet_http + sha256: "1b99ad5ae81aa9d2f12900e5f17d3681f3828629bb7f7fe7ad88076a34209840" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + cupertino_http: + dependency: transitive + description: + name: cupertino_http + sha256: "72187f715837290a63479a5b0ae709f4fedad0ed6bd0441c275eceaa02d5abae" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + url: "https://pub.dev" + source: hosted + version: "9.1.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 + url: "https://pub.dev" + source: hosted + version: "5.9.0" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + dotted_border: + dependency: transitive + description: + name: dotted_border + sha256: "99b091ec6891ba0c5331fdc2b502993c7c108f898995739a73c6845d71dad70c" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + email_validator: + dependency: "direct main" + description: + name: email_validator + sha256: b19aa5d92fdd76fbc65112060c94d45ba855105a28bb6e462de7ff03b12fa1fb + url: "https://pub.dev" + source: hosted + version: "3.0.0" + ente_accounts: + dependency: "direct main" + description: + path: "../accounts" + relative: true + source: path + version: "1.0.0" + ente_base: + dependency: "direct main" + description: + path: "../base" + relative: true + source: path + version: "1.0.0" + ente_configuration: + dependency: "direct main" + description: + path: "../configuration" + relative: true + source: path + version: "1.0.0" + ente_crypto_dart: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: f91e1545f8263df127762240c4da54a0c42835b2 + url: "https://github.com/ente-io/ente_crypto_dart.git" + source: git + version: "1.0.0" + ente_events: + dependency: "direct overridden" + description: + path: "../events" + relative: true + source: path + version: "1.0.0" + ente_lock_screen: + dependency: "direct overridden" + description: + path: "../lock_screen" + relative: true + source: path + version: "1.0.0" + ente_logging: + dependency: "direct overridden" + description: + path: "../logging" + relative: true + source: path + version: "1.0.0" + ente_network: + dependency: "direct main" + description: + path: "../network" + relative: true + source: path + version: "1.0.0" + ente_sharing: + dependency: "direct main" + description: + path: "../sharing" + relative: true + source: path + version: "1.0.0" + ente_strings: + dependency: "direct main" + description: + path: "../strings" + relative: true + source: path + version: "1.0.0" + ente_ui: + dependency: "direct main" + description: + path: "../ui" + relative: true + source: path + version: "1.0.0" + ente_utils: + dependency: "direct main" + description: + path: "../utils" + relative: true + source: path + version: "1.0.0" + event_bus: + dependency: transitive + description: + name: event_bus + sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + expandable: + dependency: transitive + description: + name: expandable + sha256: "9604d612d4d1146dafa96c6d8eec9c2ff0994658d6d09fed720ab788c7f5afc2" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + fast_base58: + dependency: transitive + description: + name: fast_base58 + sha256: "611f65633b734f27a850b51371b3eba993a5165650e12e8e7b02959f3768ba06" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_saver: + dependency: transitive + description: + name: file_saver + sha256: "9d93db09bd4da9e43238f9dd485360fc51a5c138eea5ef5f407ec56e58079ac0" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_animate: + dependency: transitive + description: + name: flutter_animate + sha256: "7befe2d3252728afb77aecaaea1dec88a89d35b9b1d2eea6d04479e8af9117b5" + url: "https://pub.dev" + source: hosted + version: "4.5.2" + flutter_email_sender: + dependency: transitive + description: + name: flutter_email_sender + sha256: d39eb5e91358fc19ec4050da69accec21f9d5b2b6bcf188aa246327b6ca2352c + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_inappwebview: + dependency: transitive + description: + name: flutter_inappwebview + sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" + url: "https://pub.dev" + source: hosted + version: "6.1.5" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" + url: "https://pub.dev" + source: hosted + version: "1.1.3" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 + url: "https://pub.dev" + source: hosted + version: "1.3.0+1" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_windows: + dependency: transitive + description: + name: flutter_inappwebview_windows + sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_local_authentication: + dependency: transitive + description: + path: "." + ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + resolved-ref: "1ac346a04592a05fd75acccf2e01fa3c7e955d96" + url: "https://github.com/eaceto/flutter_local_authentication" + source: git + version: "1.2.0" + flutter_localizations: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + url: "https://pub.dev" + source: hosted + version: "2.0.30" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_shaders: + dependency: transitive + description: + name: flutter_shaders + sha256: "34794acadd8275d971e02df03afee3dee0f98dbfb8c4837082ad0034f612a3e2" + url: "https://pub.dev" + source: hosted + version: "0.1.3" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: b9c2ad5872518a27507ab432d1fb97e8813b05f0fc693f9d40fad06d073e0678 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: transitive + description: + name: fluttertoast + sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" + url: "https://pub.dev" + source: hosted + version: "8.2.12" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 + url: "https://pub.dev" + source: hosted + version: "2.4.4" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" + hex: + dependency: transitive + description: + name: hex + sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: transitive + description: + name: http + sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 + url: "https://pub.dev" + source: hosted + version: "1.5.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + http_profile: + dependency: transitive + description: + name: http_profile + sha256: "7e679e355b09aaee2ab5010915c932cce3f2d1c11c3b2dc177891687014ffa78" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + jni: + dependency: transitive + description: + name: jni + sha256: d2c361082d554d4593c3012e26f6b188f902acd291330f13d6427641a92b3da1 + url: "https://pub.dev" + source: hosted + version: "0.14.2" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + local_auth: + dependency: transitive + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + url: "https://pub.dev" + source: hosted + version: "1.0.52" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + url: "https://pub.dev" + source: hosted + version: "1.0.10" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + logging: + dependency: "direct main" + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + modal_bottom_sheet: + dependency: transitive + description: + name: modal_bottom_sheet + sha256: eac66ef8cb0461bf069a38c5eb0fa728cee525a531a8304bd3f7b2185407c67e + url: "https://pub.dev" + source: hosted + version: "3.0.0" + native_dio_adapter: + dependency: transitive + description: + name: native_dio_adapter + sha256: "1c51bd42027861d27ccad462ba0903f5e3197461cc6d59a0bb8658cb5ad7bd01" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "9f034ba1eeca53ddb339bc8f4813cb07336a849cd735559b60cdc068ecce2dc7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + password_strength: + dependency: "direct main" + description: + name: password_strength + sha256: "0e51e3d864e37873a1347e658147f88b66e141ee36c58e19828dc5637961e1ce" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + url: "https://pub.dev" + source: hosted + version: "2.2.18" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + pinput: + dependency: transitive + description: + name: pinput + sha256: c41f42ee301505ae2375ec32871c985d3717bf8aee845620465b286e0140aad2 + url: "https://pub.dev" + source: hosted + version: "5.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: "direct main" + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + privacy_screen: + dependency: transitive + description: + name: privacy_screen + sha256: "2856e3a3ed082061a5cd2a1518f1ce6367c55916fb75e5db72e5983033a1ca54" + url: "https://pub.dev" + source: hosted + version: "0.0.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + sentry: + dependency: transitive + description: + name: sentry + sha256: "599701ca0693a74da361bc780b0752e1abc98226cf5095f6b069648116c896bb" + url: "https://pub.dev" + source: hosted + version: "8.14.2" + sentry_flutter: + dependency: transitive + description: + name: sentry_flutter + sha256: "5ba2cf40646a77d113b37a07bd69f61bb3ec8a73cbabe5537b05a7c89d2656f8" + url: "https://pub.dev" + source: hosted + version: "8.14.2" + share_plus: + dependency: transitive + description: + name: share_plus + sha256: d7dc0630a923883c6328ca31b89aa682bacbf2f8304162d29f7c6aaff03a27a1 + url: "https://pub.dev" + source: hosted + version: "11.1.0" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: a2608114b1ffdcbc9c120eb71a0e207c71da56202852d4aab8a5e30a82269e74 + url: "https://pub.dev" + source: hosted + version: "2.4.12" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + sodium: + dependency: transitive + description: + name: sodium + sha256: d9830a388e37c82891888e64cfd4c6764fa3ac716bed80ac6eab89ee42c3cd76 + url: "https://pub.dev" + source: hosted + version: "2.3.1+1" + sodium_libs: + dependency: transitive + description: + name: sodium_libs + sha256: aa764acd6ccc6113e119c2d99471aeeb4637a9a501639549b297d3a143ff49b3 + url: "https://pub.dev" + source: hosted + version: "2.2.1+6" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + step_progress_indicator: + dependency: transitive + description: + name: step_progress_indicator + sha256: b51bb1fcfc78454359f0658c5a2c21548c3825ebf76e826308e9ca10f383bbb8 + url: "https://pub.dev" + source: hosted + version: "1.0.2" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + styled_text: + dependency: transitive + description: + name: styled_text + sha256: fd624172cf629751b4f171dd0ecf9acf02a06df3f8a81bb56c0caa4f1df706c3 + url: "https://pub.dev" + source: hosted + version: "8.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + tuple: + dependency: transitive + description: + name: tuple + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" + source: hosted + version: "2.0.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + ua_client_hints: + dependency: transitive + description: + name: ua_client_hints + sha256: "1b8759a46bfeab355252881df27f2604c01bded86aa2b578869fb1b638b23118" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7" + url: "https://pub.dev" + source: hosted + version: "6.3.18" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + url: "https://pub.dev" + source: hosted + version: "6.3.4" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + url: "https://pub.dev" + source: hosted + version: "3.2.3" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + url: "https://pub.dev" + source: hosted + version: "1.1.19" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + url: "https://pub.dev" + source: hosted + version: "1.1.19" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + url: "https://pub.dev" + source: hosted + version: "5.14.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + window_manager: + dependency: transitive + description: + name: window_manager + sha256: "7eb6d6c4164ec08e1bf978d6e733f3cebe792e2a23fb07cbca25c2872bfdbdcd" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + xmlstream: + dependency: transitive + description: + name: xmlstream + sha256: cfc14e3f256997897df9481ae630d94c2d85ada5187ebeb868bb1aabc2c977b4 + url: "https://pub.dev" + source: hosted + version: "1.1.1" +sdks: + dart: ">=3.8.0 <4.0.0" + flutter: ">=3.29.0" diff --git a/mobile/packages/legacy/pubspec.yaml b/mobile/packages/legacy/pubspec.yaml new file mode 100644 index 0000000000..a13f1bf49a --- /dev/null +++ b/mobile/packages/legacy/pubspec.yaml @@ -0,0 +1,49 @@ +name: ente_legacy +description: A Flutter package containing legacy services for Ente apps +version: 1.0.0 + +environment: + sdk: ">=3.0.0 <4.0.0" + flutter: ">=1.17.0" + +dependencies: + collection: ^1.18.0 + dio: ^5.4.0 + email_validator: ^3.0.0 + ente_accounts: + path: ../accounts + ente_base: + path: ../base + ente_configuration: + path: ../configuration + ente_crypto_dart: + git: + url: https://github.com/ente-io/ente_crypto_dart.git + ente_network: + path: ../network + ente_sharing: + path: ../sharing + ente_strings: + path: ../strings + ente_ui: + path: ../ui + ente_utils: + path: ../utils + flutter: + sdk: flutter + flutter_svg: ^2.0.10+1 + intl: ^0.20.2 + logging: ^1.2.0 + password_strength: ^0.2.0 + pointycastle: ^3.7.3 + uuid: ^4.2.1 + +dev_dependencies: + flutter_lints: ^5.0.0 + flutter_test: + sdk: flutter + +flutter: + +# This package is not meant to be published +publish_to: none diff --git a/mobile/packages/legacy/pubspec_overrides.yaml b/mobile/packages/legacy/pubspec_overrides.yaml new file mode 100644 index 0000000000..6991995c69 --- /dev/null +++ b/mobile/packages/legacy/pubspec_overrides.yaml @@ -0,0 +1,24 @@ +# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_sharing,ente_strings,ente_ui,ente_utils +dependency_overrides: + ente_accounts: + path: ../accounts + ente_base: + path: ../base + ente_configuration: + path: ../configuration + ente_events: + path: ../events + ente_lock_screen: + path: ../lock_screen + ente_logging: + path: ../logging + ente_network: + path: ../network + ente_sharing: + path: ../sharing + ente_strings: + path: ../strings + ente_ui: + path: ../ui + ente_utils: + path: ../utils diff --git a/mobile/packages/strings/lib/l10n/strings_localizations.dart b/mobile/packages/strings/lib/l10n/strings_localizations.dart index 4e7c857b7b..3d2314096f 100644 --- a/mobile/packages/strings/lib/l10n/strings_localizations.dart +++ b/mobile/packages/strings/lib/l10n/strings_localizations.dart @@ -1547,6 +1547,12 @@ abstract class StringsLocalizations { /// **'You are about to add {email} as a trusted contact. They will be able to recover your account if you are absent for {numOfDays} days.'** String confirmAddingTrustedContact(String email, int numOfDays); + /// No description provided for @youCannotShareWithYourself. + /// + /// In en, this message translates to: + /// **'You cannot share with yourself'** + String get youCannotShareWithYourself; + /// No description provided for @emailNoEnteAccount. /// /// In en, this message translates to: @@ -1564,6 +1570,12 @@ abstract class StringsLocalizations { /// In en, this message translates to: /// **'Hey, can you confirm that this is your ente.io verification ID: {verificationID}'** String shareTextConfirmOthersVerificationID(Object verificationID); + + /// No description provided for @inviteToEnte. + /// + /// In en, this message translates to: + /// **'Invite to Ente'** + String get inviteToEnte; } class _StringsLocalizationsDelegate From 49533108761706c215a0951e792257880be208ab Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:54:35 +0530 Subject: [PATCH 18/19] Add ente_legacy package and integrate emergency services --- mobile/apps/locker/lib/main.dart | 5 ++ .../ui/settings/account_section_widget.dart | 31 ++++++++++++ mobile/apps/locker/pubspec.lock | 49 ++++++++++++++++++- mobile/apps/locker/pubspec.yaml | 3 ++ mobile/apps/locker/pubspec_overrides.yaml | 4 +- 5 files changed, 90 insertions(+), 2 deletions(-) diff --git a/mobile/apps/locker/lib/main.dart b/mobile/apps/locker/lib/main.dart index 7ddc304542..6d5ec62840 100644 --- a/mobile/apps/locker/lib/main.dart +++ b/mobile/apps/locker/lib/main.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:ente_accounts/services/user_service.dart'; import 'package:ente_crypto_dart/ente_crypto_dart.dart'; +import "package:ente_legacy/services/emergency_service.dart"; import 'package:ente_lock_screen/lock_screen_settings.dart'; import 'package:ente_lock_screen/ui/app_lock.dart'; import 'package:ente_lock_screen/ui/lock_screen.dart'; @@ -169,4 +170,8 @@ Future _init(bool bool, {String? via}) async { packageInfo, ); await TrashService.instance.init(preferences); + await EmergencyContactService.instance.init( + UserService.instance, + Configuration.instance, + ); } diff --git a/mobile/apps/locker/lib/ui/settings/account_section_widget.dart b/mobile/apps/locker/lib/ui/settings/account_section_widget.dart index ff4a573f54..1887252e18 100644 --- a/mobile/apps/locker/lib/ui/settings/account_section_widget.dart +++ b/mobile/apps/locker/lib/ui/settings/account_section_widget.dart @@ -4,6 +4,7 @@ import "package:ente_accounts/pages/password_entry_page.dart"; import "package:ente_accounts/pages/recovery_key_page.dart"; import "package:ente_accounts/services/user_service.dart"; import "package:ente_crypto_dart/ente_crypto_dart.dart"; +import "package:ente_legacy/pages/emergency_page.dart"; import "package:ente_lock_screen/local_authentication_service.dart"; import "package:ente_ui/components/captioned_text_widget.dart"; import "package:ente_ui/components/menu_item_widget.dart"; @@ -11,6 +12,7 @@ import "package:ente_ui/theme/ente_theme.dart"; import "package:ente_ui/utils/dialog_util.dart"; import "package:ente_utils/navigation_util.dart"; import "package:ente_utils/platform_util.dart"; +import "package:flutter/foundation.dart"; import "package:flutter/material.dart"; import "package:locker/l10n/l10n.dart"; import "package:locker/services/configuration.dart"; @@ -135,6 +137,35 @@ class AccountSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: context.l10n.legacy, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + showOnlyLoadingState: true, + onTap: () async { + final hasAuthenticated = kDebugMode || + await LocalAuthenticationService.instance + .requestLocalAuthentication( + context, + "Authenticate to manage legacy contacts", + ); + if (hasAuthenticated) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return EmergencyPage( + config: Configuration.instance, + ); + }, + ), + ).ignore(); + } + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: context.l10n.logout, diff --git a/mobile/apps/locker/pubspec.lock b/mobile/apps/locker/pubspec.lock index 161f84e08e..7c84878989 100644 --- a/mobile/apps/locker/pubspec.lock +++ b/mobile/apps/locker/pubspec.lock @@ -254,6 +254,13 @@ packages: relative: true source: path version: "1.0.0" + ente_legacy: + dependency: "direct main" + description: + path: "../../packages/legacy" + relative: true + source: path + version: "1.0.0" ente_lock_screen: dependency: "direct main" description: @@ -562,6 +569,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.3" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: b9c2ad5872518a27507ab432d1fb97e8813b05f0fc693f9d40fad06d073e0678 + url: "https://pub.dev" + source: hosted + version: "2.2.1" flutter_test: dependency: "direct dev" description: flutter @@ -940,6 +955,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -1441,6 +1464,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + url: "https://pub.dev" + source: hosted + version: "1.1.19" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + url: "https://pub.dev" + source: hosted + version: "1.1.19" vector_math: dependency: transitive description: @@ -1531,4 +1578,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.8.0 <4.0.0" - flutter: ">=3.27.0" + flutter: ">=3.29.0" diff --git a/mobile/apps/locker/pubspec.yaml b/mobile/apps/locker/pubspec.yaml index bcc3ca9a94..bbf770a765 100644 --- a/mobile/apps/locker/pubspec.yaml +++ b/mobile/apps/locker/pubspec.yaml @@ -25,6 +25,8 @@ dependencies: url: https://github.com/ente-io/ente_crypto_dart.git ente_events: path: ../../packages/events + ente_legacy: + path: ../../packages/legacy ente_lock_screen: path: ../../packages/lock_screen ente_logging: @@ -52,6 +54,7 @@ dependencies: ref: 1ac346a04592a05fd75acccf2e01fa3c7e955d96 flutter_localizations: sdk: flutter + flutter_svg: ^2.2.1 intl: ^0.20.2 io: ^1.0.5 listen_sharing_intent: ^1.9.2 diff --git a/mobile/apps/locker/pubspec_overrides.yaml b/mobile/apps/locker/pubspec_overrides.yaml index 5c1cd4757e..1969fe340f 100644 --- a/mobile/apps/locker/pubspec_overrides.yaml +++ b/mobile/apps/locker/pubspec_overrides.yaml @@ -1,4 +1,4 @@ -# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_sharing +# melos_managed_dependency_overrides: ente_accounts,ente_base,ente_configuration,ente_events,ente_lock_screen,ente_logging,ente_network,ente_strings,ente_ui,ente_utils,ente_sharing,ente_legacy dependency_overrides: ente_accounts: path: ../../packages/accounts @@ -8,6 +8,8 @@ dependency_overrides: path: ../../packages/configuration ente_events: path: ../../packages/events + ente_legacy: + path: ../../packages/legacy ente_lock_screen: path: ../../packages/lock_screen ente_logging: From 7bde215427df52a201d0d2da51bab473aa46baca Mon Sep 17 00:00:00 2001 From: AmanRajSinghMourya Date: Sat, 6 Sep 2025 06:54:43 +0530 Subject: [PATCH 19/19] Extract strings --- mobile/apps/locker/lib/l10n/app_en.arb | 3 ++- mobile/apps/locker/lib/l10n/app_localizations.dart | 6 ++++++ mobile/apps/locker/lib/l10n/app_localizations_en.dart | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/mobile/apps/locker/lib/l10n/app_en.arb b/mobile/apps/locker/lib/l10n/app_en.arb index 7e2043dae6..740adda254 100644 --- a/mobile/apps/locker/lib/l10n/app_en.arb +++ b/mobile/apps/locker/lib/l10n/app_en.arb @@ -505,5 +505,6 @@ "leaveSharedCollection": "Leave shared collection?", "noSystemLockFound": "No system lock found", "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "To enable app lock, please setup device passcode or screen lock in your system settings.", - "legacy": "Legacy" + "legacy": "Legacy", + "authToManageLegacy": "Please authenticate to manage your trusted contacts" } diff --git a/mobile/apps/locker/lib/l10n/app_localizations.dart b/mobile/apps/locker/lib/l10n/app_localizations.dart index 77363e216d..479860f2d6 100644 --- a/mobile/apps/locker/lib/l10n/app_localizations.dart +++ b/mobile/apps/locker/lib/l10n/app_localizations.dart @@ -1593,6 +1593,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Legacy'** String get legacy; + + /// No description provided for @authToManageLegacy. + /// + /// In en, this message translates to: + /// **'Please authenticate to manage your trusted contacts'** + String get authToManageLegacy; } class _AppLocalizationsDelegate diff --git a/mobile/apps/locker/lib/l10n/app_localizations_en.dart b/mobile/apps/locker/lib/l10n/app_localizations_en.dart index 7673ea2212..15488ab45e 100644 --- a/mobile/apps/locker/lib/l10n/app_localizations_en.dart +++ b/mobile/apps/locker/lib/l10n/app_localizations_en.dart @@ -906,4 +906,8 @@ class AppLocalizationsEn extends AppLocalizations { @override String get legacy => 'Legacy'; + + @override + String get authToManageLegacy => + 'Please authenticate to manage your trusted contacts'; }