From 9c16f24a088c66ea8e7664cc334da53fc314f618 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 28 Jul 2024 17:18:36 -0400 Subject: [PATCH] Ability to share selective exports (#1752) --- lib/pages/apps.dart | 21 +++++++++++++++++ lib/providers/apps_provider.dart | 40 +++++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 0cad218..6ef26ab 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -917,6 +917,27 @@ class AppsPageState extends State { }, child: Text(tr('shareAppConfigLinks'))), const Divider(), + TextButton( + onPressed: selectedAppIds.isEmpty + ? null + : () { + var exportJSON = jsonEncode( + appsProvider.generateExportJSON( + appIds: selectedApps + .map((e) => e.id) + .toList(), + overrideExportSettings: false)); + XFile f = XFile.fromData( + Uint8List.fromList( + utf8.encode(exportJSON)), + mimeType: 'application/json', + name: + '${tr('obtainiumExportHyphenatedLowercase')}-${selectedApps.length}-${DateTime.now().millisecondsSinceEpoch}'); + Share.shareXFiles([f]); + }, + child: Text( + '${tr('share')} - ${tr('obtainiumExport')}')), + const Divider(), TextButton( onPressed: () { appsProvider diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index de4c505..e3b9595 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1501,6 +1501,34 @@ class AppsProvider with ChangeNotifier { return updateAppIds; } + Map generateExportJSON( + {List? appIds, bool? overrideExportSettings}) { + Map finalExport = {}; + finalExport['apps'] = apps.values + .where((e) { + if (appIds == null) { + return true; + } else { + return appIds.contains(e.app.id); + } + }) + .map((e) => e.app.toJson()) + .toList(); + bool shouldExportSettings = settingsProvider.exportSettings; + if (overrideExportSettings != null) { + shouldExportSettings = overrideExportSettings; + } + if (shouldExportSettings) { + finalExport['settings'] = Map.fromEntries( + (settingsProvider.prefs + ?.getKeys() + .map((key) => MapEntry(key, settingsProvider.prefs?.get(key))) + .toList()) ?? + []); + } + return finalExport; + } + Future export( {bool pickOnly = false, isAuto = false, SettingsProvider? sp}) async { SettingsProvider settingsProvider = sp ?? this.settingsProvider; @@ -1531,17 +1559,7 @@ class AppsProvider with ChangeNotifier { } String? returnPath; if (!pickOnly) { - Map finalExport = {}; - finalExport['apps'] = apps.values.map((e) => e.app.toJson()).toList(); - if (settingsProvider.exportSettings) { - finalExport['settings'] = Map.fromEntries( - (settingsProvider.prefs - ?.getKeys() - .map((key) => - MapEntry(key, settingsProvider.prefs?.get(key))) - .toList()) ?? - []); - } + Map finalExport = generateExportJSON(); var result = await saf.createFile(exportDir, displayName: '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}${isAuto ? '-auto' : ''}.json',