From 6f11f850e03bbb5f8283204e90f62ed8265c060f Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 17 Sep 2022 02:12:17 -0400 Subject: [PATCH] Import now uses file picker --- lib/pages/import_export.dart | 50 +++++++++++++++++++----------------- pubspec.lock | 14 ++++++++++ pubspec.yaml | 1 + 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 4c59848..831252c 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -7,6 +8,7 @@ import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; import 'package:provider/provider.dart'; +import 'package:file_picker/file_picker.dart'; class ImportExportPage extends StatefulWidget { const ImportExportPage({super.key}); @@ -16,7 +18,7 @@ class ImportExportPage extends StatefulWidget { } class _ImportExportPageState extends State { - bool gettingAppInfo = false; + bool importInProgress = false; @override Widget build(BuildContext context) { @@ -47,7 +49,7 @@ class _ImportExportPageState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ ElevatedButton( - onPressed: appsProvider.apps.isEmpty || gettingAppInfo + onPressed: appsProvider.apps.isEmpty || importInProgress ? null : () { HapticFeedback.lightImpact(); @@ -62,42 +64,44 @@ class _ImportExportPageState extends State { height: 8, ), ElevatedButton( - onPressed: gettingAppInfo + onPressed: importInProgress ? null : () { HapticFeedback.lightImpact(); - showDialog( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: 'Obtainium Import', - items: [ - GeneratedFormItem( - 'Obtainium Export JSON Data', true, 7) - ]); - }).then((values) { - if (values != null) { + FilePicker.platform.pickFiles().then((result) { + setState(() { + importInProgress = true; + }); + if (result != null) { + String data = File(result.files.single.path!) + .readAsStringSync(); try { - jsonDecode(values[0]); + jsonDecode(data); } catch (e) { throw 'Invalid input'; } - appsProvider.importApps(values[0]).then((value) { + appsProvider.importApps(data).then((value) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( '$value App${value == 1 ? '' : 's'} Imported')), ); }); + } else { + // User canceled the picker } }).catchError((e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(e.toString())), ); + }).whenComplete(() { + setState(() { + importInProgress = false; + }); }); }, child: const Text('Obtainium Import')), - if (gettingAppInfo) + if (importInProgress) Column( children: const [ SizedBox( @@ -114,7 +118,7 @@ class _ImportExportPageState extends State { height: 32, ), TextButton( - onPressed: gettingAppInfo + onPressed: importInProgress ? null : () { showDialog( @@ -130,7 +134,7 @@ class _ImportExportPageState extends State { if (values != null) { var urls = (values[0] as String).split('\n'); setState(() { - gettingAppInfo = true; + importInProgress = true; }); addApps(urls).then((errors) { if (errors.isEmpty) { @@ -154,7 +158,7 @@ class _ImportExportPageState extends State { ); }).whenComplete(() { setState(() { - gettingAppInfo = false; + importInProgress = false; }); }); } @@ -167,7 +171,7 @@ class _ImportExportPageState extends State { children: [ const SizedBox(height: 8), TextButton( - onPressed: gettingAppInfo + onPressed: importInProgress ? null : () { showDialog( @@ -184,7 +188,7 @@ class _ImportExportPageState extends State { if (values != null) { source.getUrls(values).then((urls) { setState(() { - gettingAppInfo = true; + importInProgress = true; }); addApps(urls).then((errors) { if (errors.isEmpty) { @@ -207,7 +211,7 @@ class _ImportExportPageState extends State { } }).whenComplete(() { setState(() { - gettingAppInfo = false; + importInProgress = false; }); }); }).catchError((e) { diff --git a/pubspec.lock b/pubspec.lock index f15352c..2d0d9c9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -162,6 +162,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.1.4" + file_picker: + dependency: "direct main" + description: + name: file_picker + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" flutter: dependency: "direct main" description: flutter @@ -209,6 +216,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" flutter_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 1f3d4bb..b8b3d98 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,7 @@ dependencies: permission_handler: ^10.0.0 fluttertoast: ^8.0.9 device_info_plus: ^4.1.2 + file_picker: ^5.1.0 dev_dependencies: