diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart index b0d74d8..f988a4f 100644 --- a/lib/app_sources/fdroidrepo.dart +++ b/lib/app_sources/fdroidrepo.dart @@ -54,17 +54,25 @@ class FDroidRepo extends AppSource { @override Future>> search(String query, {Map querySettings = const {}}) async { - query = removeQueryParamsFromUrl(standardizeUrl(query)); - var res = await sourceRequest('$query/index.xml'); + String? url = querySettings['url']; + if (url == null) { + throw NoReleasesError(); + } + url = removeQueryParamsFromUrl(standardizeUrl(url)); + var res = await sourceRequest('$url/index.xml'); if (res.statusCode == 200) { var body = parse(res.body); Map> results = {}; body.querySelectorAll('application').toList().forEach((app) { String appId = app.attributes['id']!; - results['$query?appId=$appId'] = [ - app.querySelector('name')?.innerHtml ?? appId, - app.querySelector('desc')?.innerHtml ?? '' - ]; + String appName = app.querySelector('name')?.innerHtml ?? appId; + String appDesc = app.querySelector('desc')?.innerHtml ?? ''; + if (query.isEmpty || + appId.contains(query) || + appName.contains(query) || + appDesc.contains(query)) { + results['$url?appId=$appId'] = [appName, appDesc]; + } }); return results; } else { diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 1567250..888d727 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -48,6 +48,12 @@ class GitLab extends AppSource { label: tr('fallbackToOlderReleases'), defaultValue: true) ] ]; + searchQuerySettingFormItems = [ + GeneratedFormTextField('PAT', + label: tr('gitlabPATLabel').split('(')[0], + password: true, + required: false) + ]; } @override @@ -80,12 +86,18 @@ class GitLab extends AppSource { @override Future>> search(String query, {Map querySettings = const {}}) async { - String? PAT = await getPATIfAny({}); - if (PAT == null) { - throw CredsNeededError(name); + String? PAT; + if (!hostChanged) { + PAT = await getPATIfAny({}); + if (PAT == null) { + throw CredsNeededError(name); + } + } + if ((querySettings['PAT'] as String?)?.isNotEmpty == true) { + PAT = querySettings['PAT']; } var url = - 'https://$host/api/v4/search?private_token=$PAT&scope=projects&search=${Uri.encodeQueryComponent(query)}'; + 'https://$host/api/v4/search?${PAT?.isNotEmpty == true ? 'private_token=$PAT&' : ''}scope=projects&search=${Uri.encodeQueryComponent(query)}'; var res = await sourceRequest(url); if (res.statusCode != 200) { throw getObtainiumHttpError(res); @@ -174,7 +186,6 @@ class GitLab extends AppSource { ...getLinksFromParsedHTML(entryContent, RegExp('/[^/]+\\.apk\$', caseSensitive: false), '') .where((element) => Uri.parse(element).host != '') - ]; var entryId = entry.querySelector('id')?.innerHtml; var version = diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index db777a7..d686740 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:obtainium/app_sources/fdroidrepo.dart'; import 'package:obtainium/components/custom_app_bar.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form_modal.dart'; @@ -189,17 +190,29 @@ class _ImportExportPageState extends State { items: [ [ GeneratedFormTextField('searchQuery', - label: tr('searchQuery')) + label: tr('searchQuery'), + required: source.name != FDroidRepo().name) + ], + ...source.searchQuerySettingFormItems.map((e) => [e]), + [ + GeneratedFormTextField('url', + label: source.host != null + ? tr('overrideSource') + : plural('url', 1).substring(2), + defaultValue: source.host ?? '', + required: true) ], - ...source.searchQuerySettingFormItems.map((e) => [e]) ], ); }); - if (values != null && - (values['searchQuery'] as String?)?.isNotEmpty == true) { + if (values != null) { setState(() { importInProgress = true; }); + if (values['url'] != source.host) { + source = sourceProvider.getSource(values['url'], + overrideSource: source.runtimeType.toString()); + } var urlsWithDescriptions = await source .search(values['searchQuery'] as String, querySettings: values); if (urlsWithDescriptions.isNotEmpty) {