mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 13:33:28 +01:00 
			
		
		
		
	haptic feedback, listed sources
This commit is contained in:
		| @@ -11,7 +11,7 @@ import 'package:workmanager/workmanager.dart'; | ||||
| import 'package:dynamic_color/dynamic_color.dart'; | ||||
|  | ||||
| const String currentReleaseTag = | ||||
|     'v0.1.4-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES | ||||
|     'v0.1.5-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES | ||||
|  | ||||
| @pragma('vm:entry-point') | ||||
| void bgTaskCallback() { | ||||
|   | ||||
| @@ -1,9 +1,11 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/pages/app.dart'; | ||||
| 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:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| class AddAppPage extends StatefulWidget { | ||||
|   const AddAppPage({super.key}); | ||||
| @@ -19,16 +21,21 @@ class _AddAppPageState extends State<AddAppPage> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     SourceProvider sourceProvider = SourceProvider(); | ||||
|     return Center( | ||||
|       child: Form( | ||||
|           key: _formKey, | ||||
|           child: Column( | ||||
|             mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|             crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|             children: [ | ||||
|           const Spacer(), | ||||
|               Container(), | ||||
|               Padding( | ||||
|               padding: const EdgeInsets.symmetric(horizontal: 16.0), | ||||
|               child: TextFormField( | ||||
|                 padding: const EdgeInsets.all(16), | ||||
|                 child: Column( | ||||
|                   crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|                   children: [ | ||||
|                     TextFormField( | ||||
|                       decoration: const InputDecoration( | ||||
|                           hintText: 'https://github.com/Author/Project', | ||||
|                           helperText: 'Enter the App source URL'), | ||||
| @@ -41,28 +48,31 @@ class _AddAppPageState extends State<AddAppPage> { | ||||
|                         } | ||||
|                         return null; | ||||
|                       }, | ||||
|               )), | ||||
|                     ), | ||||
|                     Padding( | ||||
|             padding: | ||||
|                 const EdgeInsets.symmetric(vertical: 16.0, horizontal: 16.0), | ||||
|                       padding: const EdgeInsets.symmetric(vertical: 16.0), | ||||
|                       child: ElevatedButton( | ||||
|                         onPressed: gettingAppInfo | ||||
|                             ? null | ||||
|                             : () { | ||||
|                                 HapticFeedback.mediumImpact(); | ||||
|                                 if (_formKey.currentState!.validate()) { | ||||
|                                   setState(() { | ||||
|                                     gettingAppInfo = true; | ||||
|                                   }); | ||||
|                         sourceProvider() | ||||
|                                   sourceProvider | ||||
|                                       .getApp(urlInputController.value.text) | ||||
|                                       .then((app) { | ||||
|                           var appsProvider = context.read<AppsProvider>(); | ||||
|                                     var appsProvider = | ||||
|                                         context.read<AppsProvider>(); | ||||
|                                     var settingsProvider = | ||||
|                                         context.read<SettingsProvider>(); | ||||
|                                     if (appsProvider.apps.containsKey(app.id)) { | ||||
|                                       throw 'App already added'; | ||||
|                                     } | ||||
|                           settingsProvider.getInstallPermission().then((_) { | ||||
|                                     settingsProvider | ||||
|                                         .getInstallPermission() | ||||
|                                         .then((_) { | ||||
|                                       appsProvider.saveApp(app).then((_) { | ||||
|                                         urlInputController.clear(); | ||||
|                                         Navigator.push( | ||||
| @@ -86,10 +96,39 @@ class _AddAppPageState extends State<AddAppPage> { | ||||
|                         child: const Text('Add'), | ||||
|                       ), | ||||
|                     ), | ||||
|           const Spacer(), | ||||
|           if (gettingAppInfo) const LinearProgressIndicator(), | ||||
|                   ], | ||||
|                 ), | ||||
|     )); | ||||
|               ), | ||||
|               Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ | ||||
|                 const Text( | ||||
|                   'Supported Sources:', | ||||
|                   // style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                   // style: Theme.of(context).textTheme.bodySmall, | ||||
|                 ), | ||||
|                 const SizedBox( | ||||
|                   height: 8, | ||||
|                 ), | ||||
|                 ...sourceProvider | ||||
|                     .getSourceHosts() | ||||
|                     .map((e) => GestureDetector( | ||||
|                         onTap: () { | ||||
|                           launchUrlString('https://$e', | ||||
|                               mode: LaunchMode.externalApplication); | ||||
|                         }, | ||||
|                         child: Text( | ||||
|                           e, | ||||
|                           style: const TextStyle( | ||||
|                               decoration: TextDecoration.underline, | ||||
|                               fontStyle: FontStyle.italic), | ||||
|                         ))) | ||||
|                     .toList() | ||||
|               ]), | ||||
|               if (gettingAppInfo) | ||||
|                 const LinearProgressIndicator() | ||||
|               else | ||||
|                 Container(), | ||||
|             ], | ||||
|           )), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/providers/apps_provider.dart'; | ||||
| import 'package:webview_flutter/webview_flutter.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| @@ -47,6 +48,7 @@ class _AppPageState extends State<AppPage> { | ||||
|                                                     app!.app)) && | ||||
|                                         app?.downloadProgress == null | ||||
|                                     ? () { | ||||
|                                         HapticFeedback.heavyImpact(); | ||||
|                                         appsProvider | ||||
|                                             .downloadAndInstallLatestApp( | ||||
|                                                 [app!.app.id], | ||||
| @@ -65,6 +67,7 @@ class _AppPageState extends State<AppPage> { | ||||
|                           onPressed: app?.downloadProgress != null | ||||
|                               ? null | ||||
|                               : () { | ||||
|                                   HapticFeedback.lightImpact(); | ||||
|                                   showDialog( | ||||
|                                       context: context, | ||||
|                                       builder: (BuildContext ctx) { | ||||
| @@ -75,6 +78,7 @@ class _AppPageState extends State<AppPage> { | ||||
|                                           actions: [ | ||||
|                                             TextButton( | ||||
|                                                 onPressed: () { | ||||
|                                                   HapticFeedback.heavyImpact(); | ||||
|                                                   appsProvider | ||||
|                                                       .removeApp(app!.app.id) | ||||
|                                                       .then((_) { | ||||
| @@ -87,6 +91,7 @@ class _AppPageState extends State<AppPage> { | ||||
|                                                 child: const Text('Remove')), | ||||
|                                             TextButton( | ||||
|                                                 onPressed: () { | ||||
|                                                   HapticFeedback.lightImpact(); | ||||
|                                                   Navigator.of(context).pop(); | ||||
|                                                 }, | ||||
|                                                 child: const Text('Cancel')) | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/pages/app.dart'; | ||||
| import 'package:obtainium/providers/apps_provider.dart'; | ||||
| import 'package:obtainium/providers/settings_provider.dart'; | ||||
| @@ -26,6 +27,7 @@ class _AppsPageState extends State<AppsPage> { | ||||
|                         .isNotEmpty | ||||
|                     ? null | ||||
|                     : () { | ||||
|                         HapticFeedback.heavyImpact(); | ||||
|                         context | ||||
|                             .read<SettingsProvider>() | ||||
|                             .getInstallPermission() | ||||
| @@ -45,7 +47,10 @@ class _AppsPageState extends State<AppsPage> { | ||||
|                       style: Theme.of(context).textTheme.headline4, | ||||
|                     ) | ||||
|                   : RefreshIndicator( | ||||
|                       onRefresh: appsProvider.checkUpdates, | ||||
|                       onRefresh: () { | ||||
|                         HapticFeedback.lightImpact(); | ||||
|                         return appsProvider.checkUpdates(); | ||||
|                       }, | ||||
|                       child: ListView( | ||||
|                         children: appsProvider.apps.values | ||||
|                             .map( | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import 'dart:convert'; | ||||
|  | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/providers/apps_provider.dart'; | ||||
| import 'package:obtainium/providers/settings_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| @@ -118,6 +119,7 @@ class _SettingsPageState extends State<SettingsPage> { | ||||
|                           onPressed: appsProvider.apps.isEmpty | ||||
|                               ? null | ||||
|                               : () { | ||||
|                                   HapticFeedback.lightImpact(); | ||||
|                                   appsProvider.exportApps().then((String path) { | ||||
|                                     ScaffoldMessenger.of(context).showSnackBar( | ||||
|                                       SnackBar( | ||||
| @@ -128,6 +130,7 @@ class _SettingsPageState extends State<SettingsPage> { | ||||
|                           child: const Text('Export Apps')), | ||||
|                       ElevatedButton( | ||||
|                           onPressed: () { | ||||
|                             HapticFeedback.lightImpact(); | ||||
|                             showDialog( | ||||
|                                 context: context, | ||||
|                                 builder: (BuildContext ctx) { | ||||
| @@ -172,11 +175,13 @@ class _SettingsPageState extends State<SettingsPage> { | ||||
|                                     actions: [ | ||||
|                                       TextButton( | ||||
|                                           onPressed: () { | ||||
|                                             HapticFeedback.lightImpact(); | ||||
|                                             Navigator.of(context).pop(); | ||||
|                                           }, | ||||
|                                           child: const Text('Cancel')), | ||||
|                                       TextButton( | ||||
|                                           onPressed: () { | ||||
|                                             HapticFeedback.heavyImpact(); | ||||
|                                             if (formKey.currentState! | ||||
|                                                 .validate()) { | ||||
|                                               appsProvider | ||||
| @@ -223,6 +228,7 @@ class _SettingsPageState extends State<SettingsPage> { | ||||
|                           }), | ||||
|                         ), | ||||
|                         onPressed: () { | ||||
|                           HapticFeedback.lightImpact(); | ||||
|                           launchUrlString(settingsProvider.sourceUrl, | ||||
|                               mode: LaunchMode.externalApplication); | ||||
|                         }, | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import 'dart:convert'; | ||||
| import 'dart:io'; | ||||
|  | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/providers/notifications_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| import 'package:path_provider/path_provider.dart'; | ||||
| @@ -191,7 +192,7 @@ class AppsProvider with ChangeNotifier { | ||||
|  | ||||
|   Future<App?> getUpdate(String appId) async { | ||||
|     App? currentApp = apps[appId]!.app; | ||||
|     App newApp = await sourceProvider().getApp(currentApp.url); | ||||
|     App newApp = await SourceProvider().getApp(currentApp.url); | ||||
|     if (newApp.latestVersion != currentApp.latestVersion) { | ||||
|       newApp.installedVersion = currentApp.installedVersion; | ||||
|       await saveApp(newApp); | ||||
| @@ -299,11 +300,13 @@ class _APKPickerState extends State<APKPicker> { | ||||
|       actions: [ | ||||
|         TextButton( | ||||
|             onPressed: () { | ||||
|               HapticFeedback.lightImpact(); | ||||
|               Navigator.of(context).pop(null); | ||||
|             }, | ||||
|             child: const Text('Cancel')), | ||||
|         TextButton( | ||||
|             onPressed: () { | ||||
|               HapticFeedback.mediumImpact(); | ||||
|               Navigator.of(context).pop(apkUrl); | ||||
|             }, | ||||
|             child: const Text('Continue')) | ||||
|   | ||||
| @@ -195,7 +195,7 @@ class GitLab implements AppSource { | ||||
|   } | ||||
| } | ||||
|  | ||||
| class sourceProvider { | ||||
| class SourceProvider { | ||||
|   // Add more source classes here so they are available via the service | ||||
|   AppSource getSource(String url) { | ||||
|     if (url.toLowerCase().contains('://github.com')) { | ||||
| @@ -227,4 +227,6 @@ class sourceProvider { | ||||
|         apk.version, | ||||
|         apk.apkUrls); | ||||
|   } | ||||
|  | ||||
|   List<String> getSourceHosts() => ['github.com', 'gitlab.com']; | ||||
| } | ||||
|   | ||||
| @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | ||||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||
| # In Windows, build-name is used as the major, minor, and patch parts | ||||
| # of the product and file versions while build-number is used as the build suffix. | ||||
| version: 0.1.4+5 # When changing this, update the tag in main() accordingly | ||||
| version: 0.1.5+6 # When changing this, update the tag in main() accordingly | ||||
|  | ||||
| environment: | ||||
|   sdk: '>=2.19.0-79.0.dev <3.0.0' | ||||
|   | ||||
		Reference in New Issue
	
	Block a user