diff --git a/.flutter b/.flutter
index 4145645..bae5e49 160000
--- a/.flutter
+++ b/.flutter
@@ -1 +1 @@
-Subproject commit 41456452f29d64e8deb623a3c927524bcf9f111b
+Subproject commit bae5e49bc2a867403c43b2aae2de8f8c33b037e4
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index e03abab..fde611b 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -70,8 +70,6 @@
-
+ android:maxSdkVersion="29" />\
\ No newline at end of file
diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart
index 259f824..ac08801 100644
--- a/lib/app_sources/fdroid.dart
+++ b/lib/app_sources/fdroid.dart
@@ -76,16 +76,7 @@ class FDroid extends AppSource {
'https://$host/repo/$appId',
standardUrl,
name,
- autoSelectHighestVersionCode:
- additionalSettings['autoSelectHighestVersionCode'] == true,
- trySelectingSuggestedVersionCode:
- additionalSettings['trySelectingSuggestedVersionCode'] == true,
- filterVersionsByRegEx:
- (additionalSettings['filterVersionsByRegEx'] as String?)
- ?.isNotEmpty ==
- true
- ? additionalSettings['filterVersionsByRegEx']
- : null);
+ additionalSettings: additionalSettings);
if (!hostChanged) {
try {
var res = await sourceRequest(
@@ -166,12 +157,30 @@ class FDroid extends AppSource {
APKDetails getAPKUrlsFromFDroidPackagesAPIResponse(
Response res, String apkUrlPrefix, String standardUrl, String sourceName,
- {bool autoSelectHighestVersionCode = false,
- bool trySelectingSuggestedVersionCode = false,
- String? filterVersionsByRegEx}) {
+ {Map additionalSettings = const {}}) {
+ var autoSelectHighestVersionCode =
+ additionalSettings['autoSelectHighestVersionCode'] == true;
+ var trySelectingSuggestedVersionCode =
+ additionalSettings['trySelectingSuggestedVersionCode'] == true;
+ var filterVersionsByRegEx =
+ (additionalSettings['filterVersionsByRegEx'] as String?)?.isNotEmpty ==
+ true
+ ? additionalSettings['filterVersionsByRegEx']
+ : null;
+ var apkFilterRegEx =
+ (additionalSettings['apkFilterRegEx'] as String?)?.isNotEmpty == true
+ ? additionalSettings['apkFilterRegEx']
+ : null;
if (res.statusCode == 200) {
var response = jsonDecode(res.body);
List releases = response['packages'] ?? [];
+ if (apkFilterRegEx != null) {
+ releases = releases.where((rel) {
+ String apk = '${apkUrlPrefix}_${rel['versionCode']}.apk';
+ return filterApks([MapEntry(apk, apk)], apkFilterRegEx, false)
+ .isNotEmpty;
+ }).toList();
+ }
if (releases.isEmpty) {
throw NoReleasesError();
}
diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart
index 7722d9f..41e92df 100644
--- a/lib/app_sources/fdroidrepo.dart
+++ b/lib/app_sources/fdroidrepo.dart
@@ -1,5 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart';
+import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
@@ -45,7 +46,7 @@ class FDroidRepo extends AppSource {
String sourceSpecificStandardizeURL(String url) {
var standardUri = Uri.parse(url);
var pathSegments = standardUri.pathSegments;
- if (pathSegments.last == 'index.xml') {
+ if (pathSegments.isNotEmpty && pathSegments.last == 'index.xml') {
pathSegments.removeLast();
standardUri = standardUri.replace(path: pathSegments.join('/'));
}
@@ -60,7 +61,7 @@ class FDroidRepo extends AppSource {
throw NoReleasesError();
}
url = removeQueryParamsFromUrl(standardizeUrl(url));
- var res = await sourceRequest('$url/index.xml', {});
+ var res = await sourceRequestWithURLVariants(url, {});
if (res.statusCode == 200) {
var body = parse(res.body);
Map> results = {};
@@ -72,7 +73,11 @@ class FDroidRepo extends AppSource {
appId.contains(query) ||
appName.contains(query) ||
appDesc.contains(query)) {
- results['$url?appId=$appId'] = [appName, appDesc];
+ results[
+ '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}?appId=$appId'] = [
+ appName,
+ appDesc
+ ];
}
});
return results;
@@ -102,6 +107,26 @@ class FDroidRepo extends AppSource {
return app;
}
+ Future sourceRequestWithURLVariants(
+ String url,
+ Map additionalSettings,
+ ) async {
+ var res = await sourceRequest(
+ '$url${url.endsWith('/index.xml') ? '' : '/index.xml'}',
+ additionalSettings);
+ if (res.statusCode != 200) {
+ var base = url.endsWith('/index.xml')
+ ? url.split('/').reversed.toList().sublist(1).reversed.join('/')
+ : url;
+ res = await sourceRequest('$base/repo/index.xml', additionalSettings);
+ if (res.statusCode != 200) {
+ res = await sourceRequest(
+ '$base/fdroid/repo/index.xml', additionalSettings);
+ }
+ }
+ return res;
+ }
+
@override
Future getLatestAPKDetails(
String standardUrl,
@@ -117,9 +142,8 @@ class FDroidRepo extends AppSource {
if (appIdOrName == null) {
throw NoReleasesError();
}
- var res = await sourceRequest(
- '$standardUrl${standardUrl.endsWith('/index.xml') ? '' : '/index.xml'}',
- additionalSettings);
+ var res =
+ await sourceRequestWithURLVariants(standardUrl, additionalSettings);
if (res.statusCode == 200) {
var body = parse(res.body);
var foundApps = body.querySelectorAll('application').where((element) {
@@ -168,7 +192,8 @@ class FDroidRepo extends AppSource {
latestVersionReleases = [latestVersionReleases[0]];
}
List apkUrls = latestVersionReleases
- .map((e) => '$standardUrl/${e.querySelector('apkname')!.innerHtml}')
+ .map((e) =>
+ '${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}')
.toList();
return APKDetails(latestVersion, getApkUrlsFromUrls(apkUrls),
AppNames(authorName, appName),
diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart
index ace8ed1..d49071e 100644
--- a/lib/app_sources/izzyondroid.dart
+++ b/lib/app_sources/izzyondroid.dart
@@ -50,10 +50,6 @@ class IzzyOnDroid extends AppSource {
'https://android.izzysoft.de/frepo/$appId',
standardUrl,
name,
- autoSelectHighestVersionCode:
- additionalSettings['autoSelectHighestVersionCode'] == true,
- trySelectingSuggestedVersionCode:
- additionalSettings['trySelectingSuggestedVersionCode'] == true,
- filterVersionsByRegEx: additionalSettings['filterVersionsByRegEx']);
+ additionalSettings: additionalSettings);
}
}
diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart
index e73829e..bb8bf27 100644
--- a/lib/pages/add_app.dart
+++ b/lib/pages/add_app.dart
@@ -163,7 +163,7 @@ class AddAppPageState extends State {
app = await sourceProvider.getApp(
pickedSource!, userInput.trim(), additionalSettings,
trackOnlyOverride: trackOnly,
- overrideSource: pickedSourceOverride,
+ sourceIsOverriden: pickedSourceOverride != null,
inferAppIdIfOptional: inferAppIdIfOptional);
// Only download the APK here if you need to for the package ID
if (isTempId(app) && app.additionalSettings['trackOnly'] != true) {
diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart
index 18a61dd..7e73d0a 100644
--- a/lib/pages/import_export.dart
+++ b/lib/pages/import_export.dart
@@ -213,7 +213,7 @@ class _ImportExportPageState extends State {
setState(() {
importInProgress = true;
});
- if (values['url'] != source.hosts[0]) {
+ if (source.hosts.isEmpty || values['url'] != source.hosts[0]) {
source = sourceProvider.getSource(values['url'],
overrideSource: source.runtimeType.toString());
}
diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart
index 486c101..d2c34bf 100644
--- a/lib/providers/source_provider.dart
+++ b/lib/providers/source_provider.dart
@@ -819,7 +819,7 @@ class SourceProvider {
AppSource source, String url, Map additionalSettings,
{App? currentApp,
bool trackOnlyOverride = false,
- String? overrideSource,
+ bool sourceIsOverriden = false,
bool inferAppIdIfOptional = false}) async {
if (trackOnlyOverride || source.enforceTrackOnly) {
additionalSettings['trackOnly'] = true;
@@ -887,7 +887,9 @@ class SourceProvider {
categories: currentApp?.categories ?? const [],
releaseDate: apk.releaseDate,
changeLog: apk.changeLog,
- overrideSource: overrideSource ?? currentApp?.overrideSource,
+ overrideSource: sourceIsOverriden
+ ? source.runtimeType.toString()
+ : currentApp?.overrideSource,
allowIdChange: currentApp?.allowIdChange ??
trackOnly ||
(source.appIdInferIsOptional &&
@@ -911,6 +913,7 @@ class SourceProvider {
apps.add(await getApp(
source,
url,
+ sourceIsOverriden: sourceOverride != null,
getDefaultValuesFromFormItems(
source.combinedAppSpecificSettingFormItems)));
} catch (e) {
diff --git a/pubspec.lock b/pubspec.lock
index 40fb1c6..c777731 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -150,10 +150,10 @@ packages:
dependency: transitive
description:
name: cross_file
- sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e
+ sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5"
url: "https://pub.dev"
source: hosted
- version: "0.3.3+8"
+ version: "0.3.3+7"
crypto:
dependency: "direct main"
description:
@@ -214,10 +214,10 @@ packages:
dependency: "direct main"
description:
name: easy_localization
- sha256: de63e3b422adfc97f256cbb3f8cf12739b6a4993d390f3cadb3f51837afaefe5
+ sha256: "9c86754b22aaa3e74e471635b25b33729f958dd6fb83df0ad6612948a7b231af"
url: "https://pub.dev"
source: hosted
- version: "3.0.3"
+ version: "3.0.4"
easy_logger:
dependency: transitive
description:
@@ -238,10 +238,10 @@ packages:
dependency: transitive
description:
name: ffi
- sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
+ sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
url: "https://pub.dev"
source: hosted
- version: "2.1.0"
+ version: "2.1.2"
file:
dependency: transitive
description:
@@ -336,10 +336,10 @@ packages:
dependency: "direct main"
description:
name: flutter_markdown
- sha256: "30088ce826b5b9cfbf9e8bece34c716c8a59fa54461dcae1e4ac01a94639e762"
+ sha256: "21b085a1c185e46701373866144ced56cfb7a0c33f63c916bb8fe2d0c1491278"
url: "https://pub.dev"
source: hosted
- version: "0.6.18+3"
+ version: "0.6.19"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
@@ -394,10 +394,10 @@ packages:
dependency: "direct main"
description:
name: http
- sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
+ sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev"
source: hosted
- version: "1.2.0"
+ version: "1.2.1"
http_parser:
dependency: transitive
description:
@@ -410,10 +410,10 @@ packages:
dependency: transitive
description:
name: image
- sha256: "49a0d4b0c12402853d3f227fe7c315601b238d126aa4caa5dbb2dcf99421aa4a"
+ sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
url: "https://pub.dev"
source: hosted
- version: "4.1.6"
+ version: "4.1.7"
intl:
dependency: transitive
description:
@@ -438,6 +438,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.8.1"
+ leak_tracker:
+ dependency: transitive
+ description:
+ name: leak_tracker
+ sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
+ url: "https://pub.dev"
+ source: hosted
+ version: "10.0.0"
+ leak_tracker_flutter_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_flutter_testing
+ sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
+ leak_tracker_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_testing
+ sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
lints:
dependency: transitive
description:
@@ -458,26 +482,26 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
- version: "0.12.16"
+ version: "0.12.16+1"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+ sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
- version: "0.5.0"
+ version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
- sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
+ sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
url: "https://pub.dev"
source: hosted
- version: "1.10.0"
+ version: "1.11.0"
mime:
dependency: transitive
description:
@@ -506,10 +530,10 @@ packages:
dependency: transitive
description:
name: path
- sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+ sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
- version: "1.8.3"
+ version: "1.9.0"
path_provider:
dependency: "direct main"
description:
@@ -562,26 +586,26 @@ packages:
dependency: "direct main"
description:
name: permission_handler
- sha256: "45ff3fbcb99040fde55c528d5e3e6ca29171298a85436274d49c6201002087d6"
+ sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44"
url: "https://pub.dev"
source: hosted
- version: "11.2.0"
+ version: "11.3.0"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
- sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb"
+ sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474"
url: "https://pub.dev"
source: hosted
- version: "12.0.3"
+ version: "12.0.5"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
- sha256: c6bf440f80acd2a873d3d91a699e4cc770f86e7e6b576dda98759e8b92b39830
+ sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b
url: "https://pub.dev"
source: hosted
- version: "9.3.0"
+ version: "9.4.0"
permission_handler_html:
dependency: transitive
description:
@@ -594,10 +618,10 @@ packages:
dependency: transitive
description:
name: permission_handler_platform_interface
- sha256: "5c43148f2bfb6d14c5a8162c0a712afe891f2d847f35fcff29c406b37da43c3c"
+ sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78"
url: "https://pub.dev"
source: hosted
- version: "4.1.0"
+ version: "4.2.0"
permission_handler_windows:
dependency: transitive
description:
@@ -706,10 +730,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_web
- sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
+ sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf
url: "https://pub.dev"
source: hosted
- version: "2.2.2"
+ version: "2.2.1"
shared_preferences_windows:
dependency: transitive
description:
@@ -722,10 +746,10 @@ packages:
dependency: "direct main"
description:
name: shared_storage
- sha256: "7c65a9d64f0f5521256be974cfd74010af12196657cec9f9fb7b03b2f11bcaf6"
+ sha256: cf20428d06af065311b71e09cbfbbfe431e979a3bf9180001c1952129b7c708f
url: "https://pub.dev"
source: hosted
- version: "0.8.0"
+ version: "0.8.1"
sky_engine:
dependency: transitive
description: flutter
@@ -839,10 +863,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
- sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f"
+ sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745
url: "https://pub.dev"
source: hosted
- version: "6.2.2"
+ version: "6.3.0"
url_launcher_ios:
dependency: transitive
description:
@@ -871,18 +895,18 @@ packages:
dependency: transitive
description:
name: url_launcher_platform_interface
- sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f
+ sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
- version: "2.3.1"
+ version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
- sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
+ sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2"
url: "https://pub.dev"
source: hosted
- version: "2.2.3"
+ version: "2.2.0"
url_launcher_windows:
dependency: transitive
description:
@@ -907,30 +931,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
+ vm_service:
+ dependency: transitive
+ description:
+ name: vm_service
+ sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
+ url: "https://pub.dev"
+ source: hosted
+ version: "13.0.0"
web:
dependency: transitive
description:
name: web
- sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
+ sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad"
url: "https://pub.dev"
source: hosted
- version: "0.3.0"
+ version: "0.5.0"
webview_flutter:
dependency: "direct main"
description:
name: webview_flutter
- sha256: d81b68e88cc353e546afb93fb38958e3717282c5ac6e5d3be4a4aef9fc3c1413
+ sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932"
url: "https://pub.dev"
source: hosted
- version: "4.5.0"
+ version: "4.7.0"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
- sha256: "4ea3c4e1b8ed590162b15b8a61b41b1ef3ff179a314627c16ce40c086d94b8af"
+ sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0"
url: "https://pub.dev"
source: hosted
- version: "3.14.0"
+ version: "3.15.0"
webview_flutter_platform_interface:
dependency: transitive
description:
@@ -943,10 +975,10 @@ packages:
dependency: transitive
description:
name: webview_flutter_wkwebview
- sha256: b99ca8d8bae9c6b43d568218691aa537fb0aeae1d7d34eadf112a6aa36d26506
+ sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86"
url: "https://pub.dev"
source: hosted
- version: "3.11.0"
+ version: "3.12.0"
win32:
dependency: transitive
description:
@@ -988,5 +1020,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
- dart: ">=3.2.3 <4.0.0"
+ dart: ">=3.3.0 <4.0.0"
flutter: ">=3.16.6"
diff --git a/pubspec.yaml b/pubspec.yaml
index 908e34b..610d06c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -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: 1.0.2+252 # When changing this, update the tag in main() accordingly
+version: 1.0.3+2253 # When changing this, update the tag in main() accordingly
environment:
sdk: '>=3.0.0 <4.0.0'