Repository: acterglobal/a3
Pull request #2800: Add support to store an encryption key to specific apps
Author: login: anisha-e10
Created: 2025-04-07T11:05:43Z | Merged: 2025-04-30T09:59:39Z

This PR adds support for securely storing an encryption key using third-party password manager apps on both iOS and Android platforms. 

- If a supported password manager is installed and available to open on the device, the encryption key is copied to the clipboard, allowing users to paste it directly into the selected password manager app. 

- This improves both security and user experience when managing encryption keys.

### Platform Support

**_iOS_**: Integration has been added for the following password manager apps. If any of these are installed and can be opened, the encryption key is copied to the clipboard for manual pasting:

1. 1Password
2. Bitwarden
3. Keeper
4. Enpass
5. LastPass
6. Proton Pass

**_Android_**: Support has been added for the following apps. If detected and accessible, the encryption key is copied to the clipboard for user-initiated pasting:

1. 1Password
2. Bitwarden

_Note : The feature only activates if a supported password manager is installed and can be launched on the device._

### Reference Image : Android

![Screenshot 2025-04-28 at 6 25 04 PM](https://github.com/user-attachments/assets/83368509-314c-42e8-aab8-ce30d398eef6)

### Reference Video : Android

https://github.com/user-attachments/assets/f6142658-eac6-4106-b548-738509054470

### Reference Image : IOS

![image](https://github.com/user-attachments/assets/8d92d44b-bca4-451c-b5e3-e22bc4264cd4)

### Reference Video : IOS

https://github.com/user-attachments/assets/b2bf9db8-569d-4c40-909f-e83c4a4b7aac



Diff:
diff --git a/.changes/2800-store-encryption-key.md b/.changes/2800-store-encryption-key.md
new file mode 100644
index 000000000000..6ae391a2bf22
--- /dev/null
+++ b/.changes/2800-store-encryption-key.md
@@ -0,0 +1 @@
+- [improvement] : Adds support to store an encryption key by copying it to the clipboard for specific password manager apps (1Password, Bitwarden, Keeper, Enpass, LastPass, Proton Pass on iOS; 1Password and Proton Pass on Android) if installed.
diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
index 3096e6425bae..168ecbd422c1 100644
--- a/app/android/app/src/main/AndroidManifest.xml
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -94,5 +94,7 @@ Added    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" a
         <package android:name="com.whatsapp"/>
         <package android:name="org.telegram.messenger"/>
         <package android:name="org.thoughtcrime.securesms"/>
+        <package android:name="com.onepassword.android"/>
+        <package android:name="com.x8bit.bitwarden"/>
     </queries>
 </manifest>
diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock
index ef652242e230..b5ffac211d7e 100644
--- a/app/ios/Podfile.lock
+++ b/app/ios/Podfile.lock
@@ -272,54 +272,54 @@ EXTERNAL SOURCES:
     :path: ".symlinks/plugins/wakelock_plus/ios"
 
 SPEC CHECKSUMS:
-  acter_flutter_sdk: e60481171e46975418babb7d0ec8809eaacaaa03
-  app_badge_plus: 3227d759d2a54e4fc28ec806596ec3b740c3c17a
-  app_links: f3e17e4ee5e357b39d8b95290a9b2c299fca71c6
-  app_settings: 58017cd26b604ae98c3e65acbdd8ba173703cc82
-  appcheck: e1ab9d4e03736f03e0401554a134d1ed502d7629
-  camera_avfoundation: dd002b0330f4981e1bbcb46ae9b62829237459a4
-  connectivity_plus: 2a701ffec2c0ae28a48cf7540e279787e77c447d
-  device_calendar: 9cb33f88a02e19652ec7b8b122ca778f751b1f7b
-  device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
+  acter_flutter_sdk: b60dabd77979100055ae2e3a1f8eda19ec1dffd7
+  app_badge_plus: 132ae8b39b3d2ca8819feadd647dca9501f310a9
+  app_links: 76b66b60cc809390ca1ad69bfd66b998d2387ac7
+  app_settings: 5127ae0678de1dcc19f2293271c51d37c89428b2
+  appcheck: f3c430f928f9c69ccd8b5d4df04766ac0e57c9aa
+  camera_avfoundation: 04b44aeb14070126c6529e5ab82cc7c9fca107cf
+  connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
+  device_calendar: b55b2c5406cfba45c95a59f9059156daee1f74ed
+  device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
   DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
   DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
-  emoji_picker_flutter: 8e50ec5caac456a23a78637e02c6293ea0ac8771
-  fc_native_video_thumbnail: ded291371a8a82c449f28bf1ff84f576de8b65c5
-  file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
+  emoji_picker_flutter: ece213fc274bdddefb77d502d33080dc54e616cc
+  fc_native_video_thumbnail: ea75aa9d0f7e7b58215d2ad99ac9dddafc038bc9
+  file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
   Firebase: d80354ed7f6df5f9aca55e9eb47cc4b634735eaf
-  firebase_core: ac395f994af4e28f6a38b59e05a88ca57abeb874
+  firebase_core: 8d552814f6c01ccde5d88939fced4ec26f2f5510
   FirebaseCore: 99fe0c4b44a39f37d99e6404e02009d2db5d718d
   FirebaseCoreInternal: df24ce5af28864660ecbd13596fc8dd3a8c34629
   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
-  flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
-  flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
-  flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
+  flutter_keyboard_visibility: 4625131e43015dbbe759d9b20daaf77e0e3f6619
+  flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
+  flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
   GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
-  image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
-  integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
-  keyboard_height_plugin: 43fa8bba20fd5c4fdeed5076466b8b9d43cc6b86
-  media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
-  media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
-  media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
-  open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4
-  package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4
-  path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
-  permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
-  pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1
-  push_ios: 2bd1b4d3f782209da1f571db1250af236957e807
-  screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
+  image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
+  integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
+  keyboard_height_plugin: ef70a8181b29f27670e9e2450814ca6b6dc05b05
+  media_kit_libs_ios_video: 5a18affdb97d1f5d466dc79988b13eff6c5e2854
+  media_kit_native_event_loop: 5fba1a849a6c87a34985f1e178a0de5bd444a0cf
+  media_kit_video: 1746e198cb697d1ffb734b1d05ec429d1fcd1474
+  open_filex: 432f3cd11432da3e39f47fcc0df2b1603854eff1
+  package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
+  path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
+  permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
+  pointer_interceptor_ios: ec847ef8b0915778bed2b2cef636f4d177fa8eed
+  push_ios: d8edf21b48ecb1ee9e384dd0cd9c1b049fd1ca11
+  screen_brightness_ios: 5ed898fa50fa82a26171c086ca5e28228f932576
   SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
-  sensors_plus: 7229095999f30740798f0eeef5cd120357a8f4f2
+  sensors_plus: 6a11ed0c2e1d0bd0b20b4029d3bad27d96e0c65b
   Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
-  sentry_flutter: 2df8b0aab7e4aba81261c230cbea31c82a62dd1b
-  share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
-  shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
-  sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
+  sentry_flutter: 27892878729f42701297c628eb90e7c6529f3684
+  share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
+  shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
+  sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
   SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
-  url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
-  video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
-  volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9
-  wakelock_plus: 373cfe59b235a6dd5837d0fb88791d2f13a90d56
+  url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
+  video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
+  volume_controller: ca1cde542ee70fad77d388f82e9616488110942b
+  wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49
 
 PODFILE CHECKSUM: fcb1d6a8b69ef1614eadff3ce844375007098b37
 
diff --git a/app/ios/Runner.xcodeproj/project.pbxproj b/app/ios/Runner.xcodeproj/project.pbxproj
index 380bafc3ca93..20a277f62597 100644
--- a/app/ios/Runner.xcodeproj/project.pbxproj
+++ b/app/ios/Runner.xcodeproj/project.pbxproj
@@ -488,7 +488,7 @@
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
-				SDKROOT = iphoneos18.1;
+				SDKROOT = macosx15.4;
 				SUPPORTED_PLATFORMS = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALIDATE_PRODUCT = YES;
@@ -513,7 +513,7 @@
 				INFOPLIST_FILE = Runner/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Acter;
 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
-				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 18.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -522,6 +522,7 @@
 				PRODUCT_BUNDLE_IDENTIFIER = global.acter.a3;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = iphoneos;
 				STRIP_INSTALLED_PRODUCT = NO;
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
 				SUPPORTS_MACCATALYST = NO;
@@ -584,7 +585,7 @@
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
-				SDKROOT = iphoneos18.1;
+				SDKROOT = macosx15.4;
 				TARGETED_DEVICE_FAMILY = "1,2";
 			};
 			name = Debug;
@@ -633,7 +634,7 @@
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
 				MTL_ENABLE_DEBUG_INFO = NO;
-				SDKROOT = iphoneos18.1;
+				SDKROOT = macosx15.4;
 				SUPPORTED_PLATFORMS = iphoneos;
 				SWIFT_COMPILATION_MODE = wholemodule;
 				SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -662,7 +663,7 @@
 				INFOPLIST_FILE = Runner/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Acter;
 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
-				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 18.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -671,6 +672,7 @@
 				PRODUCT_BUNDLE_IDENTIFIER = global.acter.a3;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
+				SDKROOT = iphoneos;
 				STRIP_INSTALLED_PRODUCT = NO;
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
 				SUPPORTS_MACCATALYST = NO;
@@ -703,7 +705,7 @@
 				INFOPLIST_FILE = Runner/Info.plist;
 				INFOPLIST_KEY_CFBundleDisplayName = Acter;
 				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
-				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 18.0;
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"@executable_path/Frameworks",
@@ -713,6 +715,7 @@
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Acter App Release";
+				SDKROOT = iphoneos;
 				STRIP_INSTALLED_PRODUCT = NO;
 				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
 				SUPPORTS_MACCATALYST = NO;
diff --git a/app/ios/Runner/Info.plist b/app/ios/Runner/Info.plist
index e2b689c68eae..f2f255cff8ba 100644
--- a/app/ios/Runner/Info.plist
+++ b/app/ios/Runner/Info.plist
@@ -65,6 +65,12 @@
         <string>whatsapp</string>
         <string>sgnl</string>
         <string>tg</string>
+		<string>onepassword</string>
+		<string>bitwarden</string>
+		<string>keeper</string>
+		<string>lastpass</string>
+		<string>enpass</string> 
+		<string>protonpass</string>
     </array>
 	<key>FlutterDeepLinkingEnabled</key>
 	<false/>
diff --git a/app/lib/common/providers/app_install_check_provider.dart b/app/lib/common/providers/app_install_check_provider.dart
index 5c28d78478b7..6dc4812bd705 100644
--- a/app/lib/common/providers/app_install_check_provider.dart
+++ b/app/lib/common/providers/app_install_check_provider.dart
@@ -3,7 +3,18 @@ import 'dart:io';
 import 'package:appcheck/appcheck.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 
-enum ExternalApps { whatsApp, whatsBusiness, telegram, signal }
+enum ExternalApps {
+  whatsApp,
+  whatsBusiness,
+  telegram,
+  signal,
+  onePassword,
+  bitwarden,
+  keeper,
+  lastPass,
+  enpass,
+  protonPass,
+}
 
 final isAppInstalledProvider = FutureProvider.family<bool, ExternalApps>(
   (ref, externalApp) async {
@@ -21,6 +32,20 @@ final isAppInstalledProvider = FutureProvider.family<bool, ExternalApps>(
       ExternalApps.signal => await appCheck.isAppInstalled(
         Platform.isAndroid ? 'org.thoughtcrime.securesms' : 'sgnl://',
       ),
+      ExternalApps.onePassword => await appCheck.isAppInstalled(
+        Platform.isAndroid ? 'com.onepassword.android' : 'onepassword://',
+      ),
+      ExternalApps.bitwarden => await appCheck.isAppInstalled(
+        Platform.isAndroid ? 'com.x8bit.bitwarden' : 'bitwarden://',
+      ),
+      ExternalApps.keeper =>
+        Platform.isIOS ? appCheck.isAppInstalled('keeper://') : false,
+      ExternalApps.lastPass =>
+        Platform.isIOS ? await appCheck.isAppInstalled('lastpass://') : false,
+      ExternalApps.enpass =>
+        Platform.isIOS ? await appCheck.isAppInstalled('enpass://') : false,
+      ExternalApps.protonPass =>
+        Platform.isIOS ? await appCheck.isAppInstalled('protonpass://') : false,
     };
   }, // this means we are running
 );
diff --git a/app/lib/features/encryption_backup_feature/actions/external_storing.dart b/app/lib/features/encryption_backup_feature/actions/external_storing.dart
new file mode 100644
index 000000000000..497b57045585
--- /dev/null
+++ b/app/lib/features/encryption_backup_feature/actions/external_storing.dart
@@ -0,0 +1,66 @@
+import 'package:acter/l10n/generated/l10n.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:logging/logging.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+final _log = Logger('a3::encryption_backup_feature::external_storing');
+
+Future<void> openOnePassword({
+  required BuildContext context,
+}) async {
+  final url = 'onepassword://';
+  await _open(context: context, url: url);
+}
+
+Future<void> openBitwarden({
+  required BuildContext context,
+}) async {
+  final url = 'bitwarden://';
+  await _open(context: context, url: url);
+}
+
+Future<void> openKeeper({
+  required BuildContext context,
+}) async {
+  final url = 'keeper://';
+  await _open(context: context, url: url);
+}
+
+Future<void> openLastPass({
+  required BuildContext context,
+}) async {
+  final url = 'lastpass://';
+  await _open(context: context, url: url);
+}
+
+Future<void> openEnpass({
+  required BuildContext context,
+}) async {
+  final url = 'enpass://';
+  await _open(context: context, url: url);
+}
+
+Future<void> openProtonPass({
+  required BuildContext context,
+}) async {
+  final url = 'protonpass://';
+  await _open(context: context, url: url);
+}
+
+Future<void> _open({
+  required BuildContext context,
+  required String url,
+}) async {
+  final encodedUri = Uri.parse(url);
+  if (await canLaunchUrl(encodedUri)) {
+    await launchUrl(encodedUri);
+  } else {
+    _log.warning('App not available');
+    if (!context.mounted) return;
+    EasyLoading.showError(
+      L10n.of(context).appUnavailable,
+      duration: const Duration(seconds: 3),
+    );
+  }
+}
diff --git a/app/lib/features/encryption_backup_feature/widgets/encryption_backup_widget.dart b/app/lib/features/encryption_backup_feature/widgets/encryption_backup_widget.dart
new file mode 100644
index 000000000000..ce1e96bcd350
--- /dev/null
+++ b/app/lib/features/encryption_backup_feature/widgets/encryption_backup_widget.dart
@@ -0,0 +1,176 @@
+import 'dart:io';
+import 'package:acter/l10n/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/encryption_backup_feature/actions/external_storing.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent(L10n lang) async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess(lang.keyCopied);
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final lang = L10n.of(context);
+
+    bool isAppInstalled(WidgetRef ref, ExternalApps app) {
+      return ref.watch(isAppInstalledProvider(app)).valueOrNull == true;
+    } 
+
+    final isOnePasswordInstalled = isAppInstalled(ref, ExternalApps.onePassword);
+    final isBitwardenInstalled = isAppInstalled(ref, ExternalApps.bitwarden);
+    final isKeeperInstalled = isAppInstalled(ref, ExternalApps.keeper);
+    final isLastPassInstalled = isAppInstalled(ref, ExternalApps.lastPass);
+    final isEnpassInstalled = isAppInstalled(ref, ExternalApps.enpass);
+    final isProtonPassInstalled = isAppInstalled(ref, ExternalApps.protonPass);
+
+
+    return Wrap(
+      spacing: 16,
+      runSpacing: 16,
+      alignment: WrapAlignment.start,
+      children: [ 
+        // Copy button
+        _buildWithFirsCopyButton(
+          context: context,
+          icon: Icons.copy,
+          onTap: () async {
+            await Clipboard.setData(ClipboardData(text: encryptionKey));
+            if (context.mounted) {
+              EasyLoading.showToast(lang.keyCopied);
+            }
+          },
+          lang: lang,
+        ),
+        // Share button
+        _buildWithFirsCopyButton(
+          context: context,
+          icon: PhosphorIcons.share(),
+          onTap: () async {
+            await Share.share(encryptionKey);
+          },
+          lang: lang,
+        ),
+        // 1Password (no platform restriction)
+        if (isOnePasswordInstalled)
+          _buildActionButton(
+             context: context,
+             lang: lang,
+            icon: Icons.security,
+            onTap: () => openOnePassword(context: context),
+           
+          ),
+        // Bitwarden (no platform restriction)
+        if (isBitwardenInstalled)
+          _buildActionButton(
+            context: context,
+            lang: lang,
+            icon: Icons.vpn_key,
+            onTap: () => openBitwarden(context: context),
+           
+          ),
+        // Keeper (iOS only)
+        if (isKeeperInstalled && Platform.isIOS)
+          _buildActionButton(
+            context: context,
+            lang: lang,
+            icon: Icons.lock_person,
+            onTap: () => openKeeper(context: context),
+           
+          ),
+        // LastPass (iOS only)
+        if (isLastPassInstalled && Platform.isIOS)
+          _buildActionButton(
+            context: context,
+            lang: lang,
+            icon: Icons.password,
+            onTap: () => openLastPass(context: context),
+           
+          ),
+        // Enpass (iOS only)
+        if (isEnpassInstalled && Platform.isIOS)
+          _buildActionButton(
+            context: context,
+            lang: lang,
+            icon: PhosphorIcons.vault(),
+            onTap: () => openEnpass(context: context),
+           
+          ),
+        // ProtonPass (iOS only)
+        if (isProtonPassInstalled && Platform.isIOS)
+          _buildActionButton(
+            context: context,
+            lang: lang,
+            icon: Icons.shield,
+            onTap: () => openProtonPass(context: context),
+           
+          ),
+      ].whereType<Widget>().toList(),
+    );
+  }
+
+  Widget _buildActionButton({
+    required BuildContext context,
+    required L10n lang,
+    required IconData icon,
+    required VoidCallback onTap 
+  }) {
+    return InkWell(
+      onTap: () async {
+        await Clipboard.setData(ClipboardData(text: encryptionKey));
+        if (context.mounted) {
+          EasyLoading.showSuccess(lang.keyCopied);
+        }
+        
+        // Then perform the action
+        if (!context.mounted) return;
+        await Future.delayed(const Duration(seconds: 2));
+        onTap();
+      
+      },
+      child: Container(
+        width: 48,
+        height: 48,
+        decoration: BoxDecoration(
+          shape: BoxShape.circle,
+          color: Theme.of(context).colorScheme.surfaceContainerLow,
+        ),
+        child: Icon(icon),
+      ),
+    );
+  }
+
+  Widget _buildWithFirsCopyButton({
+    required BuildContext context,
+    required IconData icon,
+    required VoidCallback onTap,
+    required L10n lang,
+  }) {
+    return _buildActionButton(
+      icon: icon,
+      context: context,
+      lang: lang,
+      onTap: () async {
+         await _buildShareContent(lang);
+            if (!context.mounted) return;
+            await Future.delayed(const Duration(seconds: 2));
+            onTap();
+       
+      },
+    );
+  }
+}
+
diff --git a/app/lib/features/onboarding/pages/encrption_backup_page.dart b/app/lib/features/onboarding/pages/encrption_backup_page.dart
index d113b32e8941..e55478a0c9b1 100644
--- a/app/lib/features/onboarding/pages/encrption_backup_page.dart
+++ b/app/lib/features/onboarding/pages/encrption_backup_page.dart
@@ -1,12 +1,10 @@
 import 'package:acter/features/backups/providers/backup_manager_provider.dart';
+import 'package:acter/features/encryption_backup_feature/widgets/encryption_backup_widget.dart';
 import 'package:acter/features/onboarding/types.dart';
 import 'package:acter/l10n/generated/l10n.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter_easyloading/flutter_easyloading.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:phosphor_flutter/phosphor_flutter.dart';
-import 'package:share_plus/share_plus.dart';
 
 class EncryptionBackupPage extends ConsumerStatefulWidget {
   final CallNextPage? callNextPage;
@@ -71,14 +69,13 @@ class _EncryptionBackupPageState extends ConsumerState<EncryptionBackupPage> {
 
   Widget _buildEncryptionKey(BuildContext context) {
     final encKey = ref.watch(enableEncrptionBackUpProvider);
-
     return encKey.when(
       data: (data) {
         return Column(
           children: [
             _buildEncryptionKeyContent(context, data),
             const SizedBox(height: 32),
-            _buildActionButtons(context, data),
+            PasswordManagerBackupWidget(encryptionKey: data),
           ],
         );
       },
@@ -126,36 +123,6 @@ class _EncryptionBackupPageState extends ConsumerState<EncryptionBackupPage> {
     );
   }
 
-  Widget _buildActionButtons(BuildContext context, String encryptionKey) {
-    return Row(
-      mainAxisAlignment: MainAxisAlignment.center,
-      children: [
-        _buildActionButton(
-          icon: Icons.copy,
-          onTap: () async {
-            await Clipboard.setData(ClipboardData(text: encryptionKey));
-            isEnableNextButton.value = true;
-            if (context.mounted) {
-              EasyLoading.showToast(
-                L10n.of(context).encryptionBackupRecoveryCopiedToClipboard,
-              );
-            }
-          },
-          context: context,
-        ),
-        const SizedBox(width: 24),
-        _buildActionButton(
-          icon: PhosphorIcons.share(),
-          onTap: () async {
-            await Share.share(encryptionKey);
-            isEnableNextButton.value = true;
-          },
-          context: context,
-        ),
-      ],
-    );
-  }
-
   Widget _buildNavigationButtons(BuildContext context, L10n lang) {
     return Column(
       crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -186,23 +153,4 @@ class _EncryptionBackupPageState extends ConsumerState<EncryptionBackupPage> {
       child: Text(L10n.of(context).skip),
     );
   }
-
-  Widget _buildActionButton({
-    required IconData icon,
-    required VoidCallback onTap,
-    required BuildContext context,
-  }) {
-    return InkWell(
-      onTap: onTap,
-      child: Container(
-        width: 48,
-        height: 48,
-        decoration: BoxDecoration(
-          shape: BoxShape.circle,
-          color: Theme.of(context).colorScheme.surfaceContainerLow,
-        ),
-        child: Icon(icon),
-      ),
-    );
-  }
 }
diff --git a/app/lib/l10n/app_en.arb b/app/lib/l10n/app_en.arb
index 9e8ab68a23a9..b3b8c36338e7 100644
--- a/app/lib/l10n/app_en.arb
+++ b/app/lib/l10n/app_en.arb
@@ -2709,5 +2709,7 @@
   "desktopSetup": "Desktop Setup",
   "desktopSetupInfo": "When you close the Acter Window, Acter won't directly exit the program but minimize to the system tray to keep listening for notifications for you. If you want to exit Acter you need to do that from the system tray.",
   "activateFeatures": "Activate recommended Features",
-  "gotIt": "Got It"
+  "gotIt": "Got It",
+  "keyCopied": "Key copied to clipboard",
+  "@keyCopied": {}
 }
diff --git a/app/test/features/auth/widgets/encryption_backup_widget_test.dart b/app/test/features/auth/widgets/encryption_backup_widget_test.dart
new file mode 100644
index 000000000000..c16871352a9d
--- /dev/null
+++ b/app/test/features/auth/widgets/encryption_backup_widget_test.dart
@@ -0,0 +1,70 @@
+import 'package:flutter/material.dart';
+
+import 'package:flutter_test/flutter_test.dart';
+import 'package:acter/features/encryption_backup_feature/widgets/encryption_backup_widget.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+
+import '../../../helpers/test_util.dart';
+
+void main() {
+  const testEncryptionKey = 'test-encryption-key-123';
+
+  group('PasswordManagerBackupWidget', () {
+    testWidgets('renders correctly with encryption key', (tester) async {
+      await tester.pumpProviderWidget(
+        child: PasswordManagerBackupWidget(encryptionKey: testEncryptionKey),
+      );
+
+      // Verify the widget renders
+      expect(find.byType(PasswordManagerBackupWidget), findsOneWidget);
+    });
+
+    testWidgets('share button is present', (tester) async {
+      await tester.pumpProviderWidget(
+        child: PasswordManagerBackupWidget(encryptionKey: testEncryptionKey),
+      );
+      await tester.pumpAndSettle();
+      // Verify share button is present
+      expect(find.byIcon(PhosphorIcons.share()), findsOneWidget);
+    });
+
+    testWidgets('copy button is present', (tester) async {
+      await tester.pumpProviderWidget(
+        child: PasswordManagerBackupWidget(encryptionKey: testEncryptionKey),
+      );
+      await tester.pumpAndSettle();
+      // Verify share button is present
+      expect(find.byIcon(Icons.copy), findsOneWidget);
+    });
+
+    testWidgets('shows installed password manager buttons', (tester) async {
+      await tester.pumpProviderWidget(
+        child: PasswordManagerBackupWidget(encryptionKey: testEncryptionKey),
+        overrides: [
+          isAppInstalledProvider(
+            ExternalApps.onePassword,
+          ).overrideWith((ref) => Future.value(true)),
+          isAppInstalledProvider(
+            ExternalApps.bitwarden,
+          ).overrideWith((ref) => Future.value(true)),
+          isAppInstalledProvider(
+            ExternalApps.lastPass,
+          ).overrideWith((ref) => Future.value(false)),
+          isAppInstalledProvider(
+            ExternalApps.protonPass,
+          ).overrideWith((ref) => Future.value(false)),
+        ],
+      );
+
+      // Wait for the async providers to complete
+      await tester.pumpAndSettle();
+
+      // Verify password manager buttons are shown
+      expect(find.byIcon(Icons.security), findsOneWidget); // 1Password
+      expect(find.byIcon(Icons.vpn_key), findsOneWidget); // Bitwarden
+      expect(find.byIcon(Icons.lock), findsNothing); // LastPass
+      expect(find.byIcon(Icons.lock), findsNothing); // ProtonPass
+    });
+  });
+}


Reviews:
user: login: gnunicorn
body: just some code and file position improvements.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-29T16:07:49Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T04:48:32Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T04:57:31Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T04:59:11Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T05:12:11Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T05:24:35Z
user: login: anisha-e10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T05:32:50Z

Review comments:
diff_hunk: @@ -56,3 +56,78 @@ Future<void> _shareTo({
     );
   }
 }
+
+Future<void> shareToOnePassword({
path: app/lib/features/share/action/shareTo.dart
user: login: gnunicorn
body: I wouldn't expect or put these into the `share` feature, as this is specifically for this feature. I'd suggest keeping that in the `encryption_backup`-feature under a `external_storing`-actions or something
created_at: 2025-04-07T12:57:42Z
author_association: CONTRIBUTOR
path: app/ios/Runner.xcodeproj/project.pbxproj
user: login: gnunicorn
body: are  we sure these changes are needed?
created_at: 2025-04-29T15:56:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: l10n please
created_at: 2025-04-29T15:58:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
+          }
+        },
+        context: context,
+      ),
+    );
+
+    // Add share button
+    availableApps.add(
+      _buildActionButton(
+        icon: PhosphorIcons.share(),
+        onTap: () async {
+          await Share.share(encryptionKey);
+        },
+        context: context,
+      ),
+    );
+
+    void addButtonIfInstalled(
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: can we not have this function defined inline in the other function please?
created_at: 2025-04-29T15:59:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: this would be more legible if we kept using the actual list and if directly:

```suggestion
  @override
  Widget build(BuildContext context, WidgetRef ref) => Wrap(
   //..
  children: [
    // Add copy button
      _buildActionButton(
        icon: Icons.copy,
   //...
   if (ef.watch(isAppInstalledProvider(ExternalApps.onePassword)).valueOrNull == true) 
          _buildActionButton(
            icon: Icons.security,
   
```
created_at: 2025-04-29T16:03:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: l10n....
created_at: 2025-04-29T16:04:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
+          }
+        },
+        context: context,
+      ),
+    );
+
+    // Add share button
+    availableApps.add(
+      _buildActionButton(
+        icon: PhosphorIcons.share(),
+        onTap: () async {
+          await Share.share(encryptionKey);
+        },
+        context: context,
+      ),
+    );
+
+    void addButtonIfInstalled(
+      bool isInstalled,
+      IconData icon,
+      Future<void> Function() onTap,
+    ) {
+      if (isInstalled) {
+        availableApps.add(
+          _buildActionButton(
+            icon: icon,
+            onTap: () async {
+              await _buildShareContent();
+              if (!context.mounted) return;
+              await Future.delayed(const Duration(seconds: 2));
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: why do we delay?
created_at: 2025-04-29T16:04:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
+          }
+        },
+        context: context,
+      ),
+    );
+
+    // Add share button
+    availableApps.add(
+      _buildActionButton(
+        icon: PhosphorIcons.share(),
+        onTap: () async {
+          await Share.share(encryptionKey);
+        },
+        context: context,
+      ),
+    );
+
+    void addButtonIfInstalled(
+      bool isInstalled,
+      IconData icon,
+      Future<void> Function() onTap,
+    ) {
+      if (isInstalled) {
+        availableApps.add(
+          _buildActionButton(
+            icon: icon,
+            onTap: () async {
+              await _buildShareContent();
+              if (!context.mounted) return;
+              await Future.delayed(const Duration(seconds: 2));
+              await onTap();
+            },
+            context: context,
+          ),
+        );
+      }
+    }
+
+    // 1Password (no platform restriction)
+    addButtonIfInstalled(
+      ref.watch(isAppInstalledProvider(ExternalApps.onePassword)).valueOrNull == true,
+      Icons.security,
+      () => shareToOnePassword(context: context),
+    );
+
+    // Bitwarden (no platform restriction)
+    addButtonIfInstalled(
+      ref.watch(isAppInstalledProvider(ExternalApps.bitwarden)).valueOrNull == true,
+      Icons.vpn_key,
+      () => shareToBitwarden(context: context),
+    );
+
+    // Keeper (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.keeper)).valueOrNull == true,
+      Icons.lock_person,
+      () => shareToKeeper(context: context),
+    );
+
+    // LastPass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.lastPass)).valueOrNull == true,
+      Icons.password,
+      () => shareToLastPass(context: context),
+    );
+
+    // Enpass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.enpass)).valueOrNull == true,
+      PhosphorIcons.vault(),
+      () => shareToEnpass(context: context),
+    );
+
+    // ProtonPass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.protonPass)).valueOrNull == true,
+      Icons.shield,
+      () => shareToProtonPass(context: context),
+    );
+
+    return Wrap(
+      spacing: 16,
+      runSpacing: 16,
+      alignment: WrapAlignment.start,
+      children: availableApps,
+    );
+  }
+
+  Widget _buildActionButton({
+    required IconData icon,
+    required VoidCallback onTap,
+    required BuildContext context,
+  }) {
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: gnunicorn
body: to make it easier to use with above, we can just add:
```suggestion

  Widget _buildWithFirsCopyButton({
    required IconData icon,
    required VoidCallback onTap,
    required BuildContext context,
  } => _buildActionButton(icon: icon, context: context, onTap: () async {
              await _buildShareContent();
              if (!context.mounted) return;
              onTap();
  });

  Widget _buildActionButton({
    required IconData icon,
    required VoidCallback onTap,
    required BuildContext context,
  }) {
```
created_at: 2025-04-29T16:06:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: anisha-e10
body: Addressed by this [commit](https://github.com/acterglobal/a3/pull/2800/commits/db4268b21d1529a9c717d86697672009bd5f6700)
created_at: 2025-04-30T04:48:32Z
author_association: CONTRIBUTOR
path: app/ios/Runner.xcodeproj/project.pbxproj
user: login: anisha-e10
body: It's not needed actually but i have changed version for my system to make the IOS app runnable
created_at: 2025-04-30T04:57:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
+          }
+        },
+        context: context,
+      ),
+    );
+
+    // Add share button
+    availableApps.add(
+      _buildActionButton(
+        icon: PhosphorIcons.share(),
+        onTap: () async {
+          await Share.share(encryptionKey);
+        },
+        context: context,
+      ),
+    );
+
+    void addButtonIfInstalled(
+      bool isInstalled,
+      IconData icon,
+      Future<void> Function() onTap,
+    ) {
+      if (isInstalled) {
+        availableApps.add(
+          _buildActionButton(
+            icon: icon,
+            onTap: () async {
+              await _buildShareContent();
+              if (!context.mounted) return;
+              await Future.delayed(const Duration(seconds: 2));
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: anisha-e10
body: just to show the message properly that key is copied then will redirect to particular app
created_at: 2025-04-30T04:59:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: anisha-e10
body: Addressed by this [commit](https://github.com/acterglobal/a3/pull/2800/commits/b23de2a9fa981fcf14acc95c6a9f354286da42a4)
created_at: 2025-04-30T05:12:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,147 @@
+import 'dart:io';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_easyloading/flutter_easyloading.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:acter/common/providers/app_install_check_provider.dart';
+import 'package:acter/features/share/action/shareTo.dart';
+import 'package:phosphor_flutter/phosphor_flutter.dart';
+import 'package:share_plus/share_plus.dart';
+
+class PasswordManagerBackupWidget extends ConsumerWidget {
+  final String encryptionKey;
+
+  const PasswordManagerBackupWidget({
+    super.key,
+    required this.encryptionKey,
+  });
+
+  Future<void> _buildShareContent() async {
+    await Clipboard.setData(ClipboardData(text: encryptionKey));
+    EasyLoading.showSuccess('Key copied to clipboard');
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    final availableApps = <Widget>[];
+
+    // Add copy button
+    availableApps.add(
+      _buildActionButton(
+        icon: Icons.copy,
+        onTap: () async {
+          await Clipboard.setData(ClipboardData(text: encryptionKey));
+          if (context.mounted) {
+            EasyLoading.showToast('Key copied to clipboard');
+          }
+        },
+        context: context,
+      ),
+    );
+
+    // Add share button
+    availableApps.add(
+      _buildActionButton(
+        icon: PhosphorIcons.share(),
+        onTap: () async {
+          await Share.share(encryptionKey);
+        },
+        context: context,
+      ),
+    );
+
+    void addButtonIfInstalled(
+      bool isInstalled,
+      IconData icon,
+      Future<void> Function() onTap,
+    ) {
+      if (isInstalled) {
+        availableApps.add(
+          _buildActionButton(
+            icon: icon,
+            onTap: () async {
+              await _buildShareContent();
+              if (!context.mounted) return;
+              await Future.delayed(const Duration(seconds: 2));
+              await onTap();
+            },
+            context: context,
+          ),
+        );
+      }
+    }
+
+    // 1Password (no platform restriction)
+    addButtonIfInstalled(
+      ref.watch(isAppInstalledProvider(ExternalApps.onePassword)).valueOrNull == true,
+      Icons.security,
+      () => shareToOnePassword(context: context),
+    );
+
+    // Bitwarden (no platform restriction)
+    addButtonIfInstalled(
+      ref.watch(isAppInstalledProvider(ExternalApps.bitwarden)).valueOrNull == true,
+      Icons.vpn_key,
+      () => shareToBitwarden(context: context),
+    );
+
+    // Keeper (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.keeper)).valueOrNull == true,
+      Icons.lock_person,
+      () => shareToKeeper(context: context),
+    );
+
+    // LastPass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.lastPass)).valueOrNull == true,
+      Icons.password,
+      () => shareToLastPass(context: context),
+    );
+
+    // Enpass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.enpass)).valueOrNull == true,
+      PhosphorIcons.vault(),
+      () => shareToEnpass(context: context),
+    );
+
+    // ProtonPass (iOS only)
+    addButtonIfInstalled(
+      Platform.isIOS &&
+          ref.watch(isAppInstalledProvider(ExternalApps.protonPass)).valueOrNull == true,
+      Icons.shield,
+      () => shareToProtonPass(context: context),
+    );
+
+    return Wrap(
+      spacing: 16,
+      runSpacing: 16,
+      alignment: WrapAlignment.start,
+      children: availableApps,
+    );
+  }
+
+  Widget _buildActionButton({
+    required IconData icon,
+    required VoidCallback onTap,
+    required BuildContext context,
+  }) {
path: app/lib/features/onboarding/widgets/encryption_backup_widget.dart
user: login: anisha-e10
body: Addressed by this [commit](https://github.com/acterglobal/a3/pull/2800/commits/4802d55146151a4e6ffd498dde85db1b805e0f4c)
created_at: 2025-04-30T05:24:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -56,3 +56,78 @@ Future<void> _shareTo({
     );
   }
 }
+
+Future<void> shareToOnePassword({
path: app/lib/features/share/action/shareTo.dart
user: login: anisha-e10
body: Addressed by this [commit](https://github.com/acterglobal/a3/pull/2800/commits/4b12475a49ff6f22c8b87932e3d95113794ff6a8)
created_at: 2025-04-30T05:32:49Z
author_association: CONTRIBUTOR

PR comments:
user: login: codecov[bot]
created_at: 2025-04-07T11:07:57Z
body: ## [Codecov](https://app.codecov.io/gh/acterglobal/a3/pull/2800?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) Report
Attention: Patch coverage is `41.23711%` with `57 lines` in your changes missing coverage. Please review.
> Project coverage is 40.02%. Comparing base [(`7b3e4fa`)](https://app.codecov.io/gh/acterglobal/a3/commit/7b3e4fac77bea6bb830eecc85b219a8532a9454c?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) to head [(`bbbbc68`)](https://app.codecov.io/gh/acterglobal/a3/commit/bbbbc68d2aec1a92a3f2f63128633f32153d77be?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal).
> Report is 238 commits behind head on main.

| [Files with missing lines](https://app.codecov.io/gh/acterglobal/a3/pull/2800?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) | Patch % | Lines |
|---|---|---|
| [...ckup\_feature/widgets/encryption\_backup\_widget.dart](https://app.codecov.io/gh/acterglobal/a3/pull/2800?src=pr&el=tree&filepath=app%2Flib%2Ffeatures%2Fencryption_backup_feature%2Fwidgets%2Fencryption_backup_widget.dart&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal#diff-YXBwL2xpYi9mZWF0dXJlcy9lbmNyeXB0aW9uX2JhY2t1cF9mZWF0dXJlL3dpZGdldHMvZW5jcnlwdGlvbl9iYWNrdXBfd2lkZ2V0LmRhcnQ=) | 42.85% | [36 Missing :warning: ](https://app.codecov.io/gh/acterglobal/a3/pull/2800?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) |
| [...ption\_backup\_feature/actions/external\_storing.dart](https://app.codecov.io/gh/acterglobal/a3/pull/2800?src=pr&el=tree&filepath=app%2Flib%2Ffeatures%2Fencryption_backup_feature%2Factions%2Fexternal_storing.dart&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal#diff-YXBwL2xpYi9mZWF0dXJlcy9lbmNyeXB0aW9uX2JhY2t1cF9mZWF0dXJlL2FjdGlvbnMvZXh0ZXJuYWxfc3RvcmluZy5kYXJ0) | 0.00% | [21 Missing :warning: ](https://app.codecov.io/gh/acterglobal/a3/pull/2800?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) |

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #2800      +/-   ##
==========================================
+ Coverage   38.51%   40.02%   +1.51%     
==========================================
  Files         847      860      +13     
  Lines       52923    54719    +1796     
==========================================
+ Hits        20384    21903    +1519     
- Misses      32539    32816     +277     
```

| [Flag](https://app.codecov.io/gh/acterglobal/a3/pull/2800/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) | Coverage Δ | |
|---|---|---|
| [integration-test](https://app.codecov.io/gh/acterglobal/a3/pull/2800/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) | `49.11% <ø> (+2.69%)` | :arrow_up: |
| [unittest](https://app.codecov.io/gh/acterglobal/a3/pull/2800/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal) | `29.35% <41.23%> (+0.05%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/acterglobal/a3/pull/2800?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=acterglobal).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE