diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index 7587839..cf1bf75 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -23,6 +23,9 @@ class FDroid implements AppSource { return url.substring(0, match.end); } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index a98832f..6a5689d 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -29,6 +29,11 @@ class GitHub implements AppSource { return creds != null && creds.isNotEmpty ? '$creds@' : ''; } + @override + String? changeLogPageFromStandardUrl(String standardUrl) { + return '$standardUrl/releases'; + } + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 9917d58..2932fbe 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -18,6 +18,9 @@ class GitLab implements AppSource { return url.substring(0, match.end); } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart index 2f36f98..7173536 100644 --- a/lib/app_sources/izzyondroid.dart +++ b/lib/app_sources/izzyondroid.dart @@ -17,6 +17,9 @@ class IzzyOnDroid implements AppSource { return url.substring(0, match.end); } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/mullvad.dart b/lib/app_sources/mullvad.dart index bfb6397..a6ffc77 100644 --- a/lib/app_sources/mullvad.dart +++ b/lib/app_sources/mullvad.dart @@ -17,6 +17,9 @@ class Mullvad implements AppSource { return url.substring(0, match.end); } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/signal.dart b/lib/app_sources/signal.dart index 8a97b8f..76c1caa 100644 --- a/lib/app_sources/signal.dart +++ b/lib/app_sources/signal.dart @@ -12,6 +12,9 @@ class Signal implements AppSource { return 'https://$host'; } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/app_sources/sourceforge.dart b/lib/app_sources/sourceforge.dart index b46405a..7059b8d 100644 --- a/lib/app_sources/sourceforge.dart +++ b/lib/app_sources/sourceforge.dart @@ -17,6 +17,9 @@ class SourceForge implements AppSource { return url.substring(0, match.end); } + @override + String? changeLogPageFromStandardUrl(String standardUrl) => null; + @override Future getLatestAPKDetails( String standardUrl, List additionalData) async { diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index da34da4..31f9ad5 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -6,8 +6,10 @@ import 'package:obtainium/components/generated_form_modal.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:share_plus/share_plus.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class AppsPage extends StatefulWidget { const AppsPage({super.key}); @@ -172,7 +174,43 @@ class AppsPageState extends State { : (sortedApps[index].app.installedVersion != null && sortedApps[index].app.installedVersion != sortedApps[index].app.latestVersion - ? const Text('Update Available') + ? Column( + mainAxisAlignment: SourceProvider() + .getSource(sortedApps[index].app.url) + .changeLogPageFromStandardUrl( + sortedApps[index].app.url) == + null + ? MainAxisAlignment.center + : MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + const Text('Update Available'), + SourceProvider() + .getSource(sortedApps[index].app.url) + .changeLogPageFromStandardUrl( + sortedApps[index].app.url) == + null + ? const SizedBox() + : GestureDetector( + onTap: () { + launchUrlString( + SourceProvider() + .getSource( + sortedApps[index].app.url) + .changeLogPageFromStandardUrl( + sortedApps[index].app.url)!, + mode: + LaunchMode.externalApplication); + }, + child: const Text( + 'See Changes', + style: TextStyle( + fontStyle: FontStyle.italic, + decoration: + TextDecoration.underline), + )), + ], + ) : Text(sortedApps[index].app.installedVersion ?? 'Not Installed')), onTap: () { diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 853c746..37d03b5 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -136,6 +136,7 @@ abstract class AppSource { late List> additionalDataFormItems; late List additionalDataDefaults; late List moreSourceSettingsFormItems; + String? changeLogPageFromStandardUrl(String standardUrl); } abstract class MassAppSource {