From 428c208de435cba7b937d8e6980e66dc5b178a35 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 25 Sep 2022 01:41:50 -0400 Subject: [PATCH] Added share option, saveApp -> saveApps --- lib/main.dart | 22 +++++++------- lib/pages/add_app.dart | 3 +- lib/pages/app.dart | 10 +++---- lib/pages/apps.dart | 16 +++++++++++ lib/pages/import_export.dart | 2 +- lib/providers/apps_provider.dart | 21 ++++++++------ pubspec.lock | 49 ++++++++++++++++++++++++++++++++ pubspec.yaml | 1 + 8 files changed, 98 insertions(+), 26 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 9d9db25..d34806d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -109,16 +109,18 @@ class MyApp extends StatelessWidget { if (isFirstRun) { // If this is the first run, ask for notification permissions and add Obtainium to the Apps list Permission.notification.request(); - appsProvider.saveApp(App( - 'imranr98_obtainium_${GitHub().host}', - 'https://github.com/ImranR98/Obtainium', - 'ImranR98', - 'Obtainium', - currentReleaseTag, - currentReleaseTag, - [], - 0, - ['true'])); + appsProvider.saveApps([ + App( + 'imranr98_obtainium_${GitHub().host}', + 'https://github.com/ImranR98/Obtainium', + 'ImranR98', + 'Obtainium', + currentReleaseTag, + currentReleaseTag, + [], + 0, + ['true']) + ]); } } diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index a86b0cc..43e8121 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -113,7 +113,8 @@ class _AddAppPageState extends State { settingsProvider .getInstallPermission() .then((_) { - appsProvider.saveApp(app).then((_) { + appsProvider + .saveApps([app]).then((_) { Navigator.push( context, MaterialPageRoute( diff --git a/lib/pages/app.dart b/lib/pages/app.dart index ec24c9a..736ee49 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -126,8 +126,8 @@ class _AppPageState extends State { .installedVersion = updatedApp .latestVersion; - appsProvider.saveApp( - updatedApp); + appsProvider.saveApps( + [updatedApp]); } Navigator.of(context) .pop(); @@ -167,8 +167,8 @@ class _AppPageState extends State { updatedApp .installedVersion = null; - appsProvider.saveApp( - updatedApp); + appsProvider.saveApps( + [updatedApp]); } Navigator.of(context) .pop(); @@ -202,7 +202,7 @@ class _AppPageState extends State { if (app != null && values != null) { var changedApp = app.app; changedApp.additionalData = values; - appsProvider.saveApp(changedApp); + appsProvider.saveApps([changedApp]); } }); }, diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index aad265f..808147c 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -7,6 +7,7 @@ import 'package:obtainium/pages/app.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:provider/provider.dart'; +import 'package:share_plus/share_plus.dart'; class AppsPage extends StatefulWidget { const AppsPage({super.key}); @@ -194,6 +195,7 @@ class AppsPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ IconButton( + visualDensity: VisualDensity.compact, onPressed: () { showDialog?>( context: context, @@ -215,6 +217,7 @@ class AppsPageState extends State { icon: const Icon(Icons.delete_outline_outlined), ), IconButton( + visualDensity: VisualDensity.compact, onPressed: appsProvider.areDownloadsRunning() || selectedIds .where((id) => @@ -301,6 +304,19 @@ class AppsPageState extends State { icon: const Icon( Icons.file_download_outlined, )), + IconButton( + visualDensity: VisualDensity.compact, + onPressed: () { + String urls = ''; + for (var id in selectedIds) { + urls += '${appsProvider.apps[id]!.app.url}\n'; + } + urls = urls.substring(0, urls.length - 1); + Share.share(urls, + subject: 'Selected App URLs from Obtainium'); + }, + icon: const Icon(Icons.share), + ), ], )), const VerticalDivider(), diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index d6c8435..994820a 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -47,7 +47,7 @@ class _ImportExportPageState extends State { if (appsProvider.apps.containsKey(app.id)) { errorsMap.addAll({app.id: 'App already added'}); } else { - await appsProvider.saveApp(app); + await appsProvider.saveApps([app]); } } List> errors = diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index c92e3a7..b5c3927 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -124,7 +124,7 @@ class AppsProvider with ChangeNotifier { await AppInstaller.installApk(file.file.path, actionRequired: false); apps[file.appId]!.app.installedVersion = apps[file.appId]!.app.latestVersion; - await saveApp(apps[file.appId]!.app); + await saveApps([apps[file.appId]!.app]); } // Given a list of AppIds, uses stored info about the apps to download APKs and install them @@ -171,7 +171,7 @@ class AppsProvider with ChangeNotifier { int urlInd = apps[id]!.app.apkUrls.indexOf(apkUrl); if (urlInd != apps[id]!.app.preferredApkIndex) { apps[id]!.app.preferredApkIndex = urlInd; - await saveApp(apps[id]!.app); + await saveApps([apps[id]!.app]); } if (context != null || (await canInstallSilently(apps[id]!.app) && @@ -247,11 +247,14 @@ class AppsProvider with ChangeNotifier { notifyListeners(); } - Future saveApp(App app) async { - File('${(await getAppsDir()).path}/${app.id}.json') - .writeAsStringSync(jsonEncode(app.toJson())); - apps.update(app.id, (value) => AppInMemory(app, value.downloadProgress), - ifAbsent: () => AppInMemory(app, null)); + Future saveApps(List apps) async { + for (var app in apps) { + File('${(await getAppsDir()).path}/${app.id}.json') + .writeAsStringSync(jsonEncode(app.toJson())); + this.apps.update( + app.id, (value) => AppInMemory(app, value.downloadProgress), + ifAbsent: () => AppInMemory(app, null)); + } notifyListeners(); } @@ -289,7 +292,7 @@ class AppsProvider with ChangeNotifier { if (currentApp.preferredApkIndex < newApp.apkUrls.length) { newApp.preferredApkIndex = currentApp.preferredApkIndex; } - await saveApp(newApp); + await saveApps([newApp]); return newApp; } return null; @@ -353,7 +356,7 @@ class AppsProvider with ChangeNotifier { for (App a in importedApps) { a.installedVersion = apps.containsKey(a.id) ? apps[a]?.app.installedVersion : null; - await saveApp(a); + await saveApps([a]); } notifyListeners(); return importedApps.length; diff --git a/pubspec.lock b/pubspec.lock index 3219b7b..3992a85 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -324,6 +324,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" nested: dependency: transitive description: @@ -457,6 +464,48 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.3" + share_plus: + dependency: "direct main" + description: + name: share_plus + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + share_plus_linux: + dependency: transitive + description: + name: share_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + share_plus_macos: + dependency: transitive + description: + name: share_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" + share_plus_web: + dependency: transitive + description: + name: share_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + share_plus_windows: + dependency: transitive + description: + name: share_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index c803cd6..afa428e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: file_picker: ^5.1.0 animations: ^2.0.4 flutter_install_app: ^1.3.0 + share_plus: ^4.4.0 dev_dependencies: