From ab4efd85cec08d42d9877dd80537f84e27710fda Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 16 Sep 2022 20:24:47 -0400 Subject: [PATCH] Added IzzyOnDroid App Source + Bugfix for third party APK URL support + F-Droid apps have F-Droid as Author now --- lib/providers/apps_provider.dart | 2 +- lib/providers/source_provider.dart | 66 ++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index a3ac000..e92dfa4 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -119,7 +119,7 @@ class AppsProvider with ChangeNotifier { } // If the picked APK comes from an origin different from the source, get user confirmation if (apkUrl != null && - !apkUrl.toLowerCase().startsWith(apps[id]!.app.url.toLowerCase())) { + Uri.parse(apkUrl).origin != Uri.parse(apps[id]!.app.url).origin) { if (await showDialog( context: context, builder: (BuildContext ctx) { diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 640a5fb..52bed44 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -296,8 +296,7 @@ class FDroid implements AppSource { @override AppNames getAppNames(String standardUrl) { - var name = Uri.parse(standardUrl).pathSegments.last; - return AppNames(name, name); + return AppNames('F-Droid', Uri.parse(standardUrl).pathSegments.last); } } @@ -341,8 +340,69 @@ class Mullvad implements AppSource { } } +class IzzyOnDroid implements AppSource { + @override + late String host = 'android.izzysoft.de'; + + @override + String standardizeURL(String url) { + RegExp standardUrlRegEx = RegExp('^https?://$host/repo/apk/[^/]+'); + RegExpMatch? match = standardUrlRegEx.firstMatch(url.toLowerCase()); + if (match == null) { + throw notValidURL; + } + return url.substring(0, match.end); + } + + @override + Future getLatestAPKDetails(String standardUrl) async { + Response res = await get(Uri.parse(standardUrl)); + if (res.statusCode == 200) { + var parsedHtml = parse(res.body); + var multipleVersionApkUrls = parsedHtml + .querySelectorAll('a') + .where((element) => + element.attributes['href']?.toLowerCase().endsWith('.apk') ?? + false) + .map((e) => 'https://$host${e.attributes['href'] ?? ''}') + .toList(); + if (multipleVersionApkUrls.isEmpty) { + throw noAPKFound; + } + var version = parsedHtml + .querySelector('#keydata') + ?.querySelectorAll('b') + .where( + (element) => element.innerHtml.toLowerCase().contains('version')) + .toList()[0] + .parentNode + ?.parentNode + ?.children[1] + .innerHtml; + if (version == null) { + throw couldNotFindLatestVersion; + } + return APKDetails(version, [multipleVersionApkUrls[0]]); + } else { + throw couldNotFindReleases; + } + } + + @override + AppNames getAppNames(String standardUrl) { + return AppNames('IzzyOnDroid', Uri.parse(standardUrl).pathSegments.last); + } +} + class SourceProvider { - List sources = [GitHub(), GitLab(), FDroid(), Mullvad(), Signal()]; + List sources = [ + GitHub(), + GitLab(), + FDroid(), + Mullvad(), + Signal(), + IzzyOnDroid() + ]; // Add more source classes here so they are available via the service AppSource getSource(String url) {