From 657d1cd042328c09d4de1f520a871a038a5035ed Mon Sep 17 00:00:00 2001 From: ngocanhtve Date: Mon, 20 Nov 2023 10:00:08 +0700 Subject: [PATCH 01/58] Update vi.json --- assets/translations/vi.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 4b66a9e..43b6004 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -86,7 +86,7 @@ "upToDateApps": "Ứng dụng cập nhật", "nonInstalledApps": "Ứng dụng chưa được cài đặt", "importExport": "Nhập/Xuất", - "settings": "Cài đặt", + "settings": "Thiết đặt", "exportedTo": "Đã xuất sang {}", "obtainiumExport": "Xuất Obtainium", "invalidInput": "Đầu vào không hợp lệ", @@ -223,7 +223,7 @@ "moveNonInstalledAppsToBottom": "Di chuyển Ứng dụng chưa được cài đặt xuống cuối chế độ xem Ứng dụng", "gitlabPATLabel": "Mã thông báo truy cập cá nhân GitLab\n(Cho phép tìm kiếm và khám phá APK tốt hơn)", "about": "Giới thiệu", - "requiresCredentialsInSettings": "Điều này cần thông tin xác thực bổ sung (trong Cài đặt)", + "requiresCredentialsInSettings": "Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)", "checkOnStart": "Kiểm tra các bản cập nhật khi khởi động", "tryInferAppIdFromCode": "Thử suy ra ID ứng dụng từ mã nguồn", "removeOnExternalUninstall": "Tự động xóa ứng dụng đã gỡ cài đặt bên ngoài", @@ -233,7 +233,7 @@ "reversePageTransitions": "Hoạt ảnh chuyển đổi trang đảo ngược", "minStarCount": "Số lượng sao tối thiểu", "addInfoBelow": "Thêm thông tin này vào bên dưới.", - "addInfoInSettings": "Thêm thông tin này vào Cài đặt.", + "addInfoInSettings": "Thêm thông tin này vào Thiết đặt.", "githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.", "gitlabSourceNote": "Trích xuất APK GitLab có thể không hoạt động nếu không có khóa API.", "sortByFileNamesNotLinks": "Sắp xếp theo tên tệp thay vì liên kết đầy đủ", From 8dd8f471a2870487acc0f7ac9951b5efd7df8231 Mon Sep 17 00:00:00 2001 From: ngocanhtve Date: Mon, 20 Nov 2023 10:09:45 +0700 Subject: [PATCH 02/58] Update vi.json --- assets/translations/vi.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 43b6004..6672eaf 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -48,7 +48,7 @@ "noApps": "Không có ứng dụng", "noAppsForFilter": "Không có ứng dụng cho bộ lọc", "byX": "Bởi {}", - "percentProgress": "Tiến triển: {}%", + "percentProgress": "Tiến độ: {}%", "pleaseWait": "Vui lòng chờ", "updateAvailable": "Có sẵn bản cập nhật", "estimateInBracketsShort": "(Ước lượng.)", @@ -113,7 +113,7 @@ "followSystem": "Theo hệ thống", "obtainium": "Obtainium", "materialYou": "Material You", - "useBlackTheme": "Sử dụng chủ đề tối màu đen thuần túy", + "useBlackTheme": "Sử dụng chủ đề tối đen tuyền", "appSortBy": "Sắp xếp ứng dụng theo", "authorName": "Tác giả/Tên", "nameAuthor": "Tên/Tác giả", @@ -134,7 +134,7 @@ "close": "Đóng", "share": "Chia sẻ", "appNotFound": "Không tìm thấy ứng dụng", - "obtainiumExportHyphenatedLowercase": "xuất khẩu-obtainium", + "obtainiumExportHyphenatedLowercase": "xuất-obtainium", "pickAnAPK": "Chọn một APK", "appHasMoreThanOnePackage": "{} có nhiều gói:", "deviceSupportsXArch": "Thiết bị của bạn hỗ trợ kiến trúc CPU {}.", @@ -170,7 +170,7 @@ "lastUpdateCheckX": "Kiểm tra cập nhật lần cuối: {}", "remove": "Loại bỏ", "yesMarkUpdated": "Có, Đánh dấu là đã cập nhật", - "fdroid": "Chính thức của F-Droid", + "fdroid": "F-Droid Chính thức", "appIdOrName": "ID hoặc tên ứng dụng", "appId": "ID ứng dụng", "appWithIdOrNameNotFound": "Không tìm thấy ứng dụng nào có ID hoặc tên đó", From 29e1481a3bc5833039ed370c55a08dc5e95fbc59 Mon Sep 17 00:00:00 2001 From: heuwerk Date: Fri, 2 Feb 2024 11:24:47 +0100 Subject: [PATCH 03/58] Update de.json Changed "Update" in translated text to "Aktualisierung", since it is used everywhere else. --- assets/translations/de.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index 2bf8a03..9bbccf4 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -30,7 +30,7 @@ "app": "App", "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zum Nachverfolgen.", "youPickedTrackOnly": "Sie haben die Option „Nur Nachverfolgen“ gewählt.", - "trackOnlyAppDescription": "Die App wird auf Updates überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", + "trackOnlyAppDescription": "Die App wird auf Aktualisierungen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", "cancelled": "Abgebrochen", "appAlreadyAdded": "App bereits hinzugefügt", "alreadyUpToDateQuestion": "App bereits auf dem neuesten Stand?", @@ -238,7 +238,7 @@ "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", "customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')", "appsPossiblyUpdated": "App Aktualisierungen wurden versucht", - "appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Updates für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden", + "appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden", "xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.", "enableBackgroundUpdates": "Aktiviere Hintergrundaktualisierungen", "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.", @@ -268,7 +268,7 @@ "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", "versionExtractWholePage": "Versions-Extraktion per RegEx auf die gesamte Seite anwenden", "installing": "Installiere", - "skipUpdateNotifications": "Keine Benachrichtigung zu App-Updates geben", + "skipUpdateNotifications": "Keine Benachrichtigung zu App-Aktualisierungen geben", "updatesAvailableNotifChannel": "Aktualisierungen verfügbar", "appsUpdatedNotifChannel": "Apps aktualisiert", "appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht", From d88709c99966986e59f667e12882b0f3405d76c5 Mon Sep 17 00:00:00 2001 From: heuwerk Date: Fri, 2 Feb 2024 11:30:20 +0100 Subject: [PATCH 04/58] Update de.json Added forgotten translation --- assets/translations/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index 9bbccf4..dcbf094 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -226,7 +226,7 @@ "tryInferAppIdFromCode": "Versuche, die App-ID aus dem Quellcode zu ermitteln", "removeOnExternalUninstall": "Automatisches Entfernen von extern deinstallierten Apps", "pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode", - "checkUpdateOnDetailPage": "Nach Updates suchen, wenn eine App-Detailseite geöffnet wird", + "checkUpdateOnDetailPage": "Nach Aktualisierungen suchen, wenn eine App-Detailseite geöffnet wird", "disablePageTransitions": "Animationen für Seitenübergänge deaktivieren", "reversePageTransitions": "Umgekehrte Animationen für Seitenübergänge", "minStarCount": "Minimale Anzahl von Sternen", From 4c7bda8343c57caa2c53b33cfae883a0019c6f46 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 3 Feb 2024 04:24:59 -0500 Subject: [PATCH 05/58] Updated a package --- pubspec.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b2bc2cc..40fb1c6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -22,10 +22,10 @@ packages: dependency: "direct main" description: name: android_package_manager - sha256: e52ca607b9f19f95d5dae4211ed8fa93e67093f22ac570db47489c5bca512940 + sha256: "2de859fae7226a7de1c1ff9a2308f1967599408800330501a1ce97927c051153" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.1" animations: dependency: "direct main" description: From 2cc59948a778d9eac1293f0b6f8bbf8f3f90cfc5 Mon Sep 17 00:00:00 2001 From: gidano Date: Sat, 3 Feb 2024 10:59:10 +0100 Subject: [PATCH 06/58] Update hu.json --- assets/translations/hu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 74b3713..e61741f 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -303,7 +303,7 @@ "badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", - "other": "Eltávolítja az alkalmazást?" + "other": "Eltávolítja az alkalmazásokat?" }, "tooManyRequestsTryAgainInMinutes": { "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", From e4208625467d596556c4465400dee43afee38bb6 Mon Sep 17 00:00:00 2001 From: inson1 <75314629+inson1@users.noreply.github.com> Date: Sat, 3 Feb 2024 17:45:32 +0100 Subject: [PATCH 07/58] Add F-droid badge to README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ea52c19..49b62cb 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ Currently supported App sources: [Get it on GitHub](https://github.com/ImranR98/Obtainium/releases) +[Get it on F-Droid](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/) [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) From eddc245ff48ba742b9ed47f772b2d679ad314b51 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:13:02 -0500 Subject: [PATCH 08/58] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 1 + .github/ISSUE_TEMPLATE/feature_request.md | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 19ee8be..79c7e04 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -10,6 +10,7 @@ assignees: '' **Prerequisites** + **Describe the bug** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 8c28a74..67ac8f9 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -14,11 +14,14 @@ assignees: '' **Describe the feature** **Describe alternatives you've considered (if applicable)** From 64f8e2a57b18d1d1b9a4382a63edc83ee52a0086 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 17:00:56 -0500 Subject: [PATCH 09/58] Improved URL handling for F-Droid third party repos (#1399) --- lib/app_sources/fdroidrepo.dart | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart index 7722d9f..43b656f 100644 --- a/lib/app_sources/fdroidrepo.dart +++ b/lib/app_sources/fdroidrepo.dart @@ -120,6 +120,22 @@ class FDroidRepo extends AppSource { var res = await sourceRequest( '$standardUrl${standardUrl.endsWith('/index.xml') ? '' : '/index.xml'}', additionalSettings); + if (res.statusCode != 200) { + var base = standardUrl.endsWith('/index.xml') + ? standardUrl + .split('/') + .reversed + .toList() + .sublist(1) + .reversed + .join('/') + : standardUrl; + res = await sourceRequest('$base/repo/index.xml', additionalSettings); + if (res.statusCode != 200) { + res = await sourceRequest( + '$base/fdroid/repo/index.xml', additionalSettings); + } + } if (res.statusCode == 200) { var body = parse(res.body); var foundApps = body.querySelectorAll('application').where((element) { @@ -168,7 +184,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), From 4db205dd9af5e7e64af5af126befa065e1a14aa3 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 17:43:24 -0500 Subject: [PATCH 10/58] Fixed F-Droid repo search (#1400) + general search bugfixes --- lib/app_sources/fdroidrepo.dart | 52 +++++++++++++++++------------- lib/pages/add_app.dart | 2 +- lib/pages/import_export.dart | 2 +- lib/providers/source_provider.dart | 7 ++-- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart index 43b656f..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,25 +142,8 @@ class FDroidRepo extends AppSource { if (appIdOrName == null) { throw NoReleasesError(); } - var res = await sourceRequest( - '$standardUrl${standardUrl.endsWith('/index.xml') ? '' : '/index.xml'}', - additionalSettings); - if (res.statusCode != 200) { - var base = standardUrl.endsWith('/index.xml') - ? standardUrl - .split('/') - .reversed - .toList() - .sublist(1) - .reversed - .join('/') - : standardUrl; - res = await sourceRequest('$base/repo/index.xml', additionalSettings); - if (res.statusCode != 200) { - res = await sourceRequest( - '$base/fdroid/repo/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) { 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) { From b4cf0f5d2982a5f0560f7295b2c80b5b2b6285fd Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 18:00:03 -0500 Subject: [PATCH 11/58] Improved APK filter for F-Droid (#1386) --- lib/app_sources/fdroid.dart | 35 ++++++++++++++++++++------------ lib/app_sources/izzyondroid.dart | 6 +----- 2 files changed, 23 insertions(+), 18 deletions(-) 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/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); } } From db484f7b28316d8fab8a444258a83fae26f82d14 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 18:13:17 -0500 Subject: [PATCH 12/58] Don't remove storage permission (#1391) --- android/app/src/main/AndroidManifest.xml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 From 34fd673e2566404a5ae9a19d5eac8246d0023387 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 18:16:33 -0500 Subject: [PATCH 13/58] Jump in versionCode to fix updates in x86 versions (#1370) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 908e34b..6647728 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.2+2252 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From 13cd7e76c1173fa6a171310f8c7109dfc262cae6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 18 Feb 2024 18:19:29 -0500 Subject: [PATCH 14/58] Update Flutter + packages, increment version --- .flutter | 2 +- pubspec.lock | 126 ++++++++++++++++++++++++++++++++------------------- pubspec.yaml | 2 +- 3 files changed, 81 insertions(+), 49 deletions(-) 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/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 6647728..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+2252 # 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' From cfa4c680cf1387696aaf1323c702974f585d032a Mon Sep 17 00:00:00 2001 From: Achim Date: Mon, 19 Feb 2024 16:02:49 +0100 Subject: [PATCH 15/58] Set referer header for gitlab app source context There occur issues if a gitlab project refers in its release data to external hosted .apk file. In some cases (e.g. Aurora Store) download is not possible because cloudflare protection gives "forbidden" error. The referer header seems to pacify this cloudflare protection. Tested with Android 14 in an AVD emulator. Related to: #1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697 --- lib/app_sources/gitlab.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 3e1e701..d661a00 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:html/parser.dart'; @@ -104,6 +105,21 @@ class GitLab extends AppSource { String? changeLogPageFromStandardUrl(String standardUrl) => '$standardUrl/-/releases'; + @override + Future?> getRequestHeaders( + Map additionalSettings, + {bool forAPKDownload = false}) async { + // Change headers to pacify, e.g. cloudflare protection + // Related to: (#1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697) + var headers = {}; + headers[HttpHeaders.refererHeader] = 'https://gitlab.com'; + if (headers.isNotEmpty) { + return headers; + } else { + return null; + } + } + @override Future getLatestAPKDetails( String standardUrl, From 03ef649c0f5de2c44cefc09cf9f7a435f20e5eda Mon Sep 17 00:00:00 2001 From: DwainZwerg <97027379+DwainZwerg@users.noreply.github.com> Date: Tue, 20 Feb 2024 09:38:57 +0000 Subject: [PATCH 16/58] Update README.md Add IzzyOnDroid-Badge, since it isn't out of day --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 49b62cb..dda3fa7 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,13 @@ Currently supported App sources: [Get it on GitHub](https://github.com/ImranR98/Obtainium/releases) +[Get it on IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/dev.imranr.obtainium) [Get it on F-Droid](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/) - + [PGP Public Key](https://keyserver.ubuntu.com/pks/lookup?search=contact%40imranr.dev&fingerprint=on&op=index) ## Limitations From 6f5315db2796dea24330b235bc67847f3f38e8f1 Mon Sep 17 00:00:00 2001 From: ngocanhtve Date: Tue, 20 Feb 2024 21:00:39 +0700 Subject: [PATCH 17/58] Update vi.json --- assets/translations/vi.json | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 2dcde6d..e03d66e 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -72,7 +72,7 @@ "unpinFromTop": "Bỏ ghim khỏi đầu trang", "resetInstallStatusForSelectedAppsQuestion": "Đặt lại trạng thái cài đặt cho ứng dụng đã chọn?", "installStatusOfXWillBeResetExplanation": "Trạng thái cài đặt của mọi Ứng dụng đã chọn sẽ được đặt lại.\n\nĐiều này có thể hữu ích khi phiên bản Ứng dụng hiển thị trong Obtainium không chính xác do cập nhật không thành công hoặc các sự cố khác.", - "customLinkMessage": "Các liên kết này hoạt động trên các thiết bị có cài đặt Gainium", + "customLinkMessage": "Các liên kết này hoạt động trên các thiết bị có cài đặt Obtainium", "shareAppConfigLinks": "Chia sẻ cấu hình ứng dụng dưới dạng liên kết HTML", "shareSelectedAppURLs": "Chia sẻ URL ứng dụng đã chọn", "resetInstallStatus": "Đặt lại trạng thái cài đặt", @@ -80,14 +80,13 @@ "removeOutdatedFilter": "Xóa bộ lọc ứng dụng lỗi thời", "showOutdatedOnly": "Chỉ hiển thị các ứng dụng lỗi thời", "filter": "Lọc", - "filterActive": "Lọc *", "filterApps": "Lọc ứng dụng", "appName": "Tên ứng dụng", "author": "Tác giả", "upToDateApps": "Ứng dụng cập nhật", "nonInstalledApps": "Ứng dụng chưa được cài đặt", "importExport": "Nhập/Xuất", - "settings": "Cài đặt", + "settings": "Thiết đặt", "exportedTo": "Đã xuất sang {}", "obtainiumExport": "Xuất", "invalidInput": "Đầu vào không hợp lệ", @@ -132,7 +131,7 @@ "close": "Đóng", "share": "Chia sẻ", "appNotFound": "Không tìm thấy ứng dụng", - "obtainiumExportHyphenatedLowercase": "xuất khẩu-obtainium", + "obtainiumExportHyphenatedLowercase": "obtainium-export", "pickAnAPK": "Chọn một APK", "appHasMoreThanOnePackage": "{} có nhiều gói:", "deviceSupportsXArch": "Thiết bị của bạn hỗ trợ kiến trúc CPU {}.", @@ -168,7 +167,7 @@ "lastUpdateCheckX": "Kiểm tra cập nhật lần cuối: {}", "remove": "Loại bỏ", "yesMarkUpdated": "Có, Đánh dấu là đã cập nhật", - "fdroid": "Chính thức của F-Droid", + "fdroid": "F-Droid Chính thức", "appIdOrName": "ID hoặc tên ứng dụng", "appId": "ID ứng dụng", "appWithIdOrNameNotFound": "Không tìm thấy ứng dụng nào có ID hoặc tên đó", @@ -188,18 +187,18 @@ "noAPKFound": "Không tìm thấy APK", "noVersionDetection": "Không phát hiện phiên bản", "categorize": "Phân loại", - "categories": "Thể loại", - "category": "Thể loại", - "noCategory": "Không thể loại", - "noCategories": "Không thể loại", - "deleteCategoriesQuestion": "Xóa thể loại?", - "categoryDeleteWarning": "Tất cả ứng dụng trong thể loại đã xóa sẽ được đặt thành chưa được phân loại.", + "categories": "Danh mục", + "category": "Danh mục", + "noCategory": "Không danh mục", + "noCategories": "Không danh mục", + "deleteCategoriesQuestion": "Xóa danh mục?", + "categoryDeleteWarning": "Tất cả ứng dụng trong danh mục đã xóa sẽ được đặt thành chưa được phân loại.", "addCategory": "Thêm thể loại", "label": "Nhãn", "language": "Ngôn ngữ", "copiedToClipboard": "Sao chép vào clipboard", "storagePermissionDenied": "Quyền lưu trữ bị từ chối", - "selectedCategorizeWarning": "Điều này sẽ thay thế mọi cài đặt thể loại hiện có cho Ứng dụng đã chọn.", + "selectedCategorizeWarning": "Điều này sẽ thay thế mọi thiết đặt danh mục hiện có cho Ứng dụng đã chọn.", "filterAPKsByRegEx": "Lọc APK theo biểu thức chính quy", "removeFromObtainium": "Loại khỏi Obtainium", "uninstallFromDevice": "Gỡ cài đặt khỏi thiết bị", @@ -212,7 +211,7 @@ "versionDetectionExplanation": "Đối chiếu chuỗi phiên bản với phiên bản được phát hiện từ hệ điều hành", "versionDetection": "Phát hiện phiên bản", "standardVersionDetection": "Phát hiện phiên bản tiêu chuẩn", - "groupByCategory": "Nhóm theo thể loại", + "groupByCategory": "Nhóm theo danh mục", "autoApkFilterByArch": "Cố gắng lọc APK theo kiến trúc CPU nếu có thể", "overrideSource": "Ghi đè nguồn", "dontShowAgain": "Đừng hiển thị thông tin này nữa", @@ -221,7 +220,7 @@ "moveNonInstalledAppsToBottom": "Chuyển Ứng dụng chưa được cài đặt xuống cuối danh sách", "gitlabPATLabel": "GitLab Token\n(Cho phép tìm kiếm và lọc APK tốt hơn)", "about": "Giới thiệu", - "requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Cài đặt)", + "requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)", "checkOnStart": "Kiểm tra các bản cập nhật khi khởi động", "tryInferAppIdFromCode": "Thử suy ra ID ứng dụng từ mã nguồn", "removeOnExternalUninstall": "Tự động xóa ứng dụng đã gỡ cài đặt bên ngoài", @@ -231,7 +230,7 @@ "reversePageTransitions": "Hoạt ảnh chuyển đổi trang đảo ngược", "minStarCount": "Số lượng sao tối thiểu", "addInfoBelow": "Thêm thông tin này vào bên dưới.", - "addInfoInSettings": "Thêm thông tin này vào Cài đặt.", + "addInfoInSettings": "Thêm thông tin này vào Thiết đặt.", "githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.", "gitlabSourceNote": "Trích xuất APK GitLab có thể không hoạt động nếu không có khóa API.", "sortByLastLinkSegment": "Chỉ sắp xếp theo đoạn cuối của liên kết", @@ -256,7 +255,7 @@ "highlightTouchTargets": "Đánh dấu các mục tiêu cảm ứng ít rõ ràng hơn", "pickExportDir": "Chọn thư mục xuất", "autoExportOnChanges": "Tự động xuất", - "includeSettings": "Bao gồm cài đặt ứng dụng", + "includeSettings": "Bao gồm thiết đặt", "filterVersionsByRegEx": "Lọc phiên bản theo biểu thức chính quy", "trySelectingSuggestedVersionCode": "Thử chọn APK Mã phiên bản được đề xuất", "dontSortReleasesList": "Giữ lại thứ tự phát hành từ API", @@ -298,9 +297,9 @@ "installed": "Đã cài đặt", "latest": "Mới nhất", "invertRegEx": "Đảo ngược biểu thức chính quy", - "note": "Note", - "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", - "badDownload": "The APK could not be parsed (incompatible or partial download)", + "note": "Ghi chú", + "selfHostedNote": "Trình đơn thả xuống \"{}\" có thể được dùng để tiếp cận các phiên bản tự lưu trữ/tùy chỉnh của bất kỳ nguồn nào.", + "badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)", "removeAppQuestion": { "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" From 1cfb258dccbbadaeec1ce6add7b0d941d22f6f82 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 25 Feb 2024 15:41:12 -0500 Subject: [PATCH 18/58] Allow any source to be overridden (#1420) --- lib/pages/add_app.dart | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index bb8bf27..e280519 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:obtainium/app_sources/html.dart'; import 'package:obtainium/components/custom_app_bar.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form_modal.dart'; @@ -62,18 +61,6 @@ class AddAppPageState extends State { var prevHost = pickedSource?.hosts.isNotEmpty == true ? pickedSource?.hosts[0] : null; - try { - var naturalSource = - valid ? sourceProvider.getSource(userInput) : null; - if (naturalSource != null && - naturalSource.runtimeType.toString() != - HTML().runtimeType.toString()) { - // If input has changed to match a regular source, reset the override - pickedSourceOverride = null; - } - } catch (e) { - // ignore - } var source = valid ? sourceProvider.getSource(userInput, overrideSource: pickedSourceOverride) @@ -361,8 +348,9 @@ class AddAppPageState extends State { [ GeneratedFormDropdown( 'overrideSource', - defaultValue: HTML().runtimeType.toString(), + defaultValue: '', [ + MapEntry('', tr('none')), ...sourceProvider.sources.map( (s) => MapEntry(s.runtimeType.toString(), s.name)) ], @@ -577,11 +565,7 @@ class AddAppPageState extends State { const SizedBox( height: 16, ), - if (pickedSourceOverride != null || - (pickedSource != null && - pickedSource.runtimeType.toString() == - HTML().runtimeType.toString())) - getHTMLSourceOverrideDropdown(), + if (pickedSource != null) getHTMLSourceOverrideDropdown(), if (shouldShowSearchBar()) getSearchBarRow(), if (pickedSource != null) FutureBuilder( From ef3b01ac56871cf6cccc66781c90355017a99bbe Mon Sep 17 00:00:00 2001 From: Achim Date: Mon, 26 Feb 2024 13:42:56 +0100 Subject: [PATCH 19/58] Use gitlab host defined in class member variable --- lib/app_sources/gitlab.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index d661a00..8edf359 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -112,7 +112,7 @@ class GitLab extends AppSource { // Change headers to pacify, e.g. cloudflare protection // Related to: (#1397, #1389, #1384, #1382, #1381, #1380, #1359, #854, #785, #697) var headers = {}; - headers[HttpHeaders.refererHeader] = 'https://gitlab.com'; + headers[HttpHeaders.refererHeader] = 'https://${hosts[0]}'; if (headers.isNotEmpty) { return headers; } else { From 90e6e5a3a3694deac8aac08096958f6cf1aed879 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Thu, 29 Feb 2024 19:17:53 -0500 Subject: [PATCH 20/58] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dda3fa7..3acfdf2 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Currently supported App sources: [Get it on IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/dev.imranr.obtainium) -[Get it on F-Droid](https://f-droid.org/packages/dev.imranr.obtainium.fdroid/) From f66753498b7017a18721411a9cc08961b74f4be8 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Mar 2024 19:46:30 -0500 Subject: [PATCH 21/58] Bugfix for installing apps with ID change step (#1424) --- lib/providers/apps_provider.dart | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index f6c2881..4b1d0e6 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -717,7 +717,7 @@ class AppsProvider with ChangeNotifier { appsToInstall = moveStrToEnd(appsToInstall, obtainiumId, strB: obtainiumTempId); - Future updateFn(String id, {bool skipInstalls = false}) async { + Future updateFn(String id, {bool skipInstalls = false}) async { try { var downloadedArtifact = // ignore: use_build_context_synchronously @@ -730,8 +730,8 @@ class AppsProvider with ChangeNotifier { } else { downloadedDir = downloadedArtifact as DownloadedXApkDir; } - var appId = downloadedFile?.appId ?? downloadedDir!.appId; - bool willBeSilent = await canInstallSilently(apps[appId]!.app); + id = downloadedFile?.appId ?? downloadedDir!.appId; + bool willBeSilent = await canInstallSilently(apps[id]!.app); switch (settingsProvider.installMethod) { case InstallMethodSettings.normal: if (!(await settingsProvider.getInstallPermission( @@ -773,18 +773,19 @@ class AppsProvider with ChangeNotifier { } if (willBeSilent && context == null) { notificationsProvider?.notify(SilentUpdateAttemptNotification( - [apps[appId]!.app], - id: appId.hashCode)); + [apps[id]!.app], + id: id.hashCode)); } + installedIds.add(id); } } finally { apps[id]?.downloadProgress = null; notifyListeners(); } - installedIds.add(id); } catch (e) { errors.add(id, e, appName: apps[id]?.name); } + return id; } if (forceParallelDownloads || !settingsProvider.parallelDownloads) { @@ -792,9 +793,9 @@ class AppsProvider with ChangeNotifier { await updateFn(id); } } else { - await Future.wait( + List ids = await Future.wait( appsToInstall.map((id) => updateFn(id, skipInstalls: true))); - for (var id in appsToInstall) { + for (var id in ids) { if (!errors.appIdNames.containsKey(id)) { await updateFn(id); } From 26be524c6dbd0ebb943d41ccd8220ff328c2aedb Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Mar 2024 19:50:04 -0500 Subject: [PATCH 22/58] Bugfix: 'null' changelog for some track-only apps (#1425) --- lib/app_sources/github.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 151e159..251a118 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -400,7 +400,7 @@ class GitHub extends AppSource { if (version == null) { throw NoVersionError(); } - var changeLog = targetRelease['body'].toString(); + var changeLog = (targetRelease['body'] ?? '').toString(); return APKDetails( version, targetRelease['apkUrls'] as List>, From fd8f967036a5e7c0b9f41ef32142535f3864aa32 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Mar 2024 20:18:07 -0500 Subject: [PATCH 23/58] Show latest APK name/count on app page (#1426) --- assets/translations/bs.json | 5 ++++- assets/translations/cs.json | 5 ++++- assets/translations/de.json | 5 ++++- assets/translations/en.json | 4 ++++ assets/translations/es.json | 5 ++++- assets/translations/fa.json | 5 ++++- assets/translations/fr.json | 5 ++++- assets/translations/hu.json | 5 ++++- assets/translations/it.json | 5 ++++- assets/translations/ja.json | 5 ++++- assets/translations/nl.json | 5 ++++- assets/translations/pl.json | 5 ++++- assets/translations/pt.json | 5 ++++- assets/translations/ru.json | 5 ++++- assets/translations/standardize.js | 7 +++---- assets/translations/sv.json | 5 ++++- assets/translations/tr.json | 5 ++++- assets/translations/vi.json | 4 ++++ assets/translations/zh.json | 5 ++++- lib/pages/app.dart | 4 ++++ 20 files changed, 79 insertions(+), 20 deletions(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 12f5336..044fbd2 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", "showOutdatedOnly": "Prikaži samo zastarjele aplikacije", "filter": "Filtriranje", - "filterActive": "Filtriranje", "filterApps": "Filtriraj aplikacije", "appName": "Naziv aplikacije", "author": "Autor", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} i još jedna aplikacija je vjerovatno ažurirana.", "other": "{} i još {} aplikacija su vjerovatno ažurirane." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 1f1003b..aa061bb 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Odstranit filtr Neaktuální", "showOutdatedOnly": "Zobrazovat pouze zastaralé aplikace", "filter": "Filtr", - "filterActive": "Filtr *", "filterApps": "Filtrovat aplikace", "appName": "Název aplikace", "author": "Autor", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} a 1 další aplikace možno aktualizovat", "other": "{} a {} další aplikace mohou být aktualizovány." + }, + "apk": { + "one": "{} APK", + "other": "{} APK" } } diff --git a/assets/translations/de.json b/assets/translations/de.json index dcbf094..cc41601 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "App-Filter ‚Nicht aktuell‘ entfernen", "showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen", "filter": "Filter", - "filterActive": "Filter *", "filterApps": "Apps filtern", "appName": "App Name", "author": "Autor", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/en.json b/assets/translations/en.json index fbc3b5f..df464bd 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -351,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } \ No newline at end of file diff --git a/assets/translations/es.json b/assets/translations/es.json index a12abc4..da5cbd2 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Elimiar filtro de aplicaciones desactualizado", "showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas", "filter": "Filtrar", - "filterActive": "Filtrar *", "filterApps": "Filtrar Actualizaciones", "appName": "Nombre de la aplicación", "author": "Autor", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} y 1 aplicación más podría haber sido actualizada.", "other": "{} y {} aplicaciones más podrían haber sido actualizadas." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 4635928..eb9124f 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "فیلتر برنامه قدیمی را حذف کنید", "showOutdatedOnly": "فقط برنامه های قدیمی را نشان دهید", "filter": "فیلتر", - "filterActive": "فیلتر *", "filterApps": "فیلتر کردن برنامه ها", "appName": "نام برنامه", "author": "سازنده", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.", "other": "ممکن است {} و {} برنامه های دیگر به روز شده باشند." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 06ff757..f0fcc43 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Supprimer le filtre d'application obsolète", "showOutdatedOnly": "Afficher uniquement les applications obsolètes", "filter": "Filtre", - "filterActive": "Filtre *", "filterApps": "Filtrer les applications", "appName": "Nom de l'application", "author": "Auteur", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "une": "{} et 1 application supplémentaire ont peut-être été mises à jour.", "other": "{} et {} autres applications peuvent avoir été mises à jour." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/hu.json b/assets/translations/hu.json index e61741f..2a99639 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Távolítsa el az elavult app szűrőt", "showOutdatedOnly": "Csak az elavult appok megjelenítése", "filter": "Szűrő", - "filterActive": "Szűrő *", "filterApps": "Appok szűrése", "appName": "App név", "author": "Szerző", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} és 1 további alkalmazás is frissült.", "other": "{} és {} további alkalmazás is frissült." + }, + "apk": { + "one": "{} APK", + "other": "{} APK-k" } } diff --git a/assets/translations/it.json b/assets/translations/it.json index d0d62e9..eae443a 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Rimuovi il filtro per le app non aggiornate", "showOutdatedOnly": "Mostra solo le app non aggiornate", "filter": "Filtri", - "filterActive": "Filtri *", "filterApps": "Filtra app", "appName": "Nome dell'app", "author": "Autore", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} e un'altra app potrebbero essere state aggiornate.", "other": "{} e altre {} app potrebbero essere state aggiornate." + }, + "apk": { + "one": "{} APK", + "other": "{} APK" } } diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 352dfad..9694ea9 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "アップデートが存在するアプリのフィルターを解除", "showOutdatedOnly": "アップデートが存在するアプリのみ表示する", "filter": "フィルター", - "filterActive": "フィルター *", "filterApps": "アプリをフィルタリングする", "appName": "アプリ名", "author": "作者", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" + }, + "apk": { + "one": "{}APK", + "other": "{}APK" } } diff --git a/assets/translations/nl.json b/assets/translations/nl.json index b9d73af..ca29402 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Verwijder out-of-date app filter", "showOutdatedOnly": "Toon alleen out-of-date apps", "filter": "Filter", - "filterActive": "Filteren *", "filterApps": "Filter apps", "appName": "App naam", "author": "Auteur", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} en nog 1 app zijn mogelijk bijgewerkt.", "other": "{} en {} meer apps zijn mogelijk bijgwerkt." + }, + "apk": { + "one": "{} APK", + "other": "{} APK's" } } diff --git a/assets/translations/pl.json b/assets/translations/pl.json index b8e1d60..983ab0b 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Usuń filtr nieaktualnych aplikacji", "showOutdatedOnly": "Pokaż tylko nieaktualne aplikacje", "filter": "FIltr", - "filterActive": "Filtruj *", "filterApps": "Filtruj aplikacje", "appName": "Nazwa aplikacji", "author": "Autor", @@ -378,5 +377,9 @@ "few": "{} i {} inne apki mogły zostać zaktualizowane.", "many": "{} i {} innych apek mogło zostać zaktualizowanych.", "other": "{} i {} inne apki mogły zostać zaktualizowane." + }, + "apk": { + "one": "{} APK", + "other": "{} APK" } } diff --git a/assets/translations/pt.json b/assets/translations/pt.json index d264842..8f9558b 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Remover filtro de aplicativos desatualizados", "showOutdatedOnly": "Mostrar apenas aplicativos desatualizados", "filter": "Filtro", - "filterActive": "Filtro *", "filterApps": "Filtrar aplicativos", "appName": "Nome do aplicativo", "author": "Autor", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} e um outro aplicativo podem ter sido atualizados.", "other": "{} e {} outros aplicativos podem ter sido atualizados." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 654d484..3b7c7d6 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Удалить фильтр для устаревших приложений", "showOutdatedOnly": "Показывать только устаревшие приложения", "filter": "Фильтр", - "filterActive": "Фильтр *", "filterApps": "Фильтровать приложения", "appName": "Название приложения", "author": "Автор", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} и ещё 1 приложение могли быть обновлены", "other": "{} и ещё {} приложений могли быть обновлены" + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/standardize.js b/assets/translations/standardize.js index a1188e3..f852654 100644 --- a/assets/translations/standardize.js +++ b/assets/translations/standardize.js @@ -58,11 +58,10 @@ const main = async () => { return `${translationsDir}/${f}` }).filter(f => f.endsWith('.json') && f != templateFile) - const templateTranslation = require(templateFile) - + const templateTranslation = JSON.parse(fs.readFileSync(templateFile).toString()) otherFiles.forEach(file => { - const thisTranslationOriginal = require(file) + const thisTranslationOriginal = JSON.parse(fs.readFileSync((file).toString())) const thisTranslationNew = {} Object.keys(templateTranslation).forEach(k => { thisTranslationNew[k] = thisTranslationOriginal[k] || templateTranslation[k] @@ -72,7 +71,7 @@ const main = async () => { for (let i in otherFiles) { const file = otherFiles[i] - const thisTranslation = require(file) + const thisTranslation = JSON.parse(fs.readFileSync((file).toString())) const translationKeys = Object.keys(templateTranslation) for (let j in translationKeys) { const k = translationKeys[j] diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 966580a..cd6efc6 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Ta bort Utgånga App-filtret", "showOutdatedOnly": "Visa Endast Utgånga Appar", "filter": "Filtrera", - "filterActive": "Filter *", "filterApps": "Filtrera Appar", "appName": "Appnamn", "author": "Utvecklare", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} och 1 till app kan ha uppdaterats.", "other": "{} och {} appar till kan ha uppdaterats." + }, + "apk": { + "one": "{} APK", + "other": "{} APK:er" } } diff --git a/assets/translations/tr.json b/assets/translations/tr.json index 6584b25..526af9d 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "Güncel Olmayan Uygulama Filtresini Kaldır", "showOutdatedOnly": "Yalnızca Güncel Olmayan Uygulamaları Göster", "filter": "Filtre", - "filterActive": "Filtre *", "filterApps": "Uygulamaları Filtrele", "appName": "Uygulama Adı", "author": "Yazar", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} ve 1 diğer uygulama muhtemelen güncellendi.", "other": "{} ve {} daha fazla uygulama muhtemelen güncellendi." + }, + "apk": { + "one": "{} APK", + "other": "{} APK'lar" } } diff --git a/assets/translations/vi.json b/assets/translations/vi.json index e03d66e..a89ea7d 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -351,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} và 1 ứng dụng khác có thể đã được cập nhật.", "other": "{} và {} ứng dụng khác có thể đã được cập nhật." + }, + "apk": { + "one": "{} APK", + "other": "{} APKs" } } diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 87f0bde..9ebe167 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -80,7 +80,6 @@ "removeOutdatedFilter": "删除失效的应用筛选", "showOutdatedOnly": "只显示待更新应用", "filter": "筛选", - "filterActive": "筛选 *", "filterApps": "筛选应用", "appName": "应用名称", "author": "作者", @@ -352,5 +351,9 @@ "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} 和另外 1 个应用已尝试更新。", "other": "“{}”和另外 {} 个应用已尝试更新。" + }, + "apk": { + "one": "{}APK", + "other": "{}APK" } } diff --git a/lib/pages/app.dart b/lib/pages/app.dart index d7a4e67..cbccc9c 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -104,6 +104,10 @@ class _AppPageState extends State { if (installedVersionIsEstimate) { infoLines = '${tr('pseudoVersionInUse')}\n$infoLines'; } + if ((app?.app.apkUrls.length ?? 0) > 0) { + infoLines = + '$infoLines\n${app?.app.apkUrls.length == 1 ? app?.app.apkUrls[0].key : plural('apk', app?.app.apkUrls.length ?? 0)}'; + } return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, From a827046acc4155b0a8474739b9344a6cf9d6b63a Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Mar 2024 20:21:46 -0500 Subject: [PATCH 24/58] More BG update interval options (#1431) --- lib/providers/settings_provider.dart | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 147dfc9..1b0edcc 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -30,8 +30,22 @@ enum SortOrderSettings { ascending, descending } const maxAPIRateLimitMinutes = 30; const minUpdateIntervalMinutes = maxAPIRateLimitMinutes + 30; -const maxUpdateIntervalMinutes = 4320; -List updateIntervals = [15, 30, 60, 120, 180, 360, 720, 1440, 4320, 0] +const maxUpdateIntervalMinutes = 43200; +List updateIntervals = [ + 15, + 30, + 60, + 120, + 180, + 360, + 720, + 1440, + 4320, + 10080, + 20160, + 43200, + 0 +] .where((element) => (element >= minUpdateIntervalMinutes && element <= maxUpdateIntervalMinutes) || From afc0c3a2fab056cf921d18b025af4fd9caf95ae6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 1 Mar 2024 20:34:15 -0500 Subject: [PATCH 25/58] Upgrade packages, increment version --- .flutter | 2 +- pubspec.lock | 42 +++++++++++++++++++++--------------------- pubspec.yaml | 2 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.flutter b/.flutter index bae5e49..7482962 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit bae5e49bc2a867403c43b2aae2de8f8c33b037e4 +Subproject commit 7482962148e8d758338d8a28f589f317e1e42ba4 diff --git a/pubspec.lock b/pubspec.lock index c777731..ea9066a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,10 +70,10 @@ packages: dependency: "direct main" description: name: background_fetch - sha256: "34550cf9b383e5a1844e7d22119aa500508c7df9421fa967c9fb4430d6cb2878" + sha256: "1a7868d9bd165eb177f039ff8244cfa7952340b18f7caabf322b26e712b438a3" url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.3" boolean_selector: dependency: transitive description: @@ -150,10 +150,10 @@ packages: dependency: transitive description: name: cross_file - sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5" + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" url: "https://pub.dev" source: hosted - version: "0.3.3+7" + version: "0.3.4+1" crypto: dependency: "direct main" description: @@ -206,18 +206,18 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d url: "https://pub.dev" source: hosted - version: "1.6.9" + version: "1.7.0" easy_localization: dependency: "direct main" description: name: easy_localization - sha256: "9c86754b22aaa3e74e471635b25b33729f958dd6fb83df0ad6612948a7b231af" + sha256: c145aeb6584aedc7c862ab8c737c3277788f47488bfdf9bae0fe112bd0a4789c url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.5" easy_logger: dependency: transitive description: @@ -336,10 +336,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "21b085a1c185e46701373866144ced56cfb7a0c33f63c916bb8fe2d0c1491278" + sha256: a64c5323ac83ed2b7940d2b6288d160aa1753ff271ba9d9b2a86770414aa3eab url: "https://pub.dev" source: hosted - version: "0.6.19" + version: "0.6.20+1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -666,10 +666,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" share_plus: dependency: "direct main" description: @@ -730,10 +730,10 @@ packages: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" shared_preferences_windows: dependency: transitive description: @@ -855,10 +855,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.2.5" url_launcher_android: dependency: transitive description: @@ -871,10 +871,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.2.5" url_launcher_linux: dependency: transitive description: @@ -903,10 +903,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" url_launcher_windows: dependency: transitive description: @@ -1021,4 +1021,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.0 <4.0.0" - flutter: ">=3.16.6" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 610d06c..62e9067 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.3+2253 # When changing this, update the tag in main() accordingly +version: 1.0.4+2254 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From 0ad9bbdd8e76669a96f78d47e6ca0ebd123cb5f8 Mon Sep 17 00:00:00 2001 From: gidano Date: Sun, 3 Mar 2024 09:32:21 +0100 Subject: [PATCH 26/58] Update hu.json --- assets/translations/hu.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 2a99639..035fd86 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", - "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", + "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezést)", "about": "Rólunk", "requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", "checkOnStart": "Egyszer az alkalmazás indításakor is", @@ -282,14 +282,14 @@ "parallelDownloads": "Párhuzamos letöltéseket enged", "installMethod": "Telepítési mód", "normal": "Normál", - "root": "Gyökér", + "root": "Root", "shizukuBinderNotFound": "A Shizuku nem fut", "useSystemFont": "Használja a rendszer betűtípusát", "systemFontError": "Hiba a rendszer betűtípusának betöltésekor: {}", "useVersionCodeAsOSVersion": "Az app verziókód használata a rendszer által észlelt verzióként", "requestHeader": "Kérelem fejléc", "useLatestAssetDateAsReleaseDate": "Használja a legújabb tartalomfeltöltést megjelenési dátumként", - "defaultPseudoVersioningMethod": "Alapértelmezett álversziós módszer", + "defaultPseudoVersioningMethod": "Alapértelmezett álverziós módszer", "partialAPKHash": "Részleges APK Hash", "APKLinkHash": "APK Link Hash", "directAPKLink": "Közvetlen APK Link", From 66122f1608b56399da6b2c40c9a91a6b8a6d3c27 Mon Sep 17 00:00:00 2001 From: Matsuri Date: Sun, 3 Mar 2024 23:58:18 +0800 Subject: [PATCH 27/58] Update zh.json - Translate new strings - Correct inaccurate translations Signed-off-by: Matsuri --- assets/translations/zh.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 9ebe167..d4e7aa3 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -52,7 +52,7 @@ "pleaseWait": "请稍候", "updateAvailable": "更新可用", "notInstalled": "未安装", - "pseudoVersion": "伪版本", + "pseudoVersion": "虚拟版本号", "selectAll": "全选", "deselectX": "取消选择 {}", "xWillBeRemovedButRemainInstalled": "“{}”将从 Obtainium 中删除,但仍安装在您的设备中。", @@ -208,7 +208,7 @@ "changes": "更新日志", "releaseDate": "发行日期", "importFromURLsInFile": "从文件中的 URL 导入(如 OPML)", - "versionDetectionExplanation": "将版本字符串与操作系统检测到的版本进行协调", + "versionDetectionExplanation": "使发行版本号与应用定义的版本号一致", "versionDetection": "版本检测", "standardVersionDetection": "常规版本检测", "groupByCategory": "按类别分组显示", @@ -224,7 +224,7 @@ "checkOnStart": "启动时进行一次检查", "tryInferAppIdFromCode": "尝试从源代码推断应用 ID", "removeOnExternalUninstall": "自动删除列表中已卸载的应用", - "pickHighestVersionCode": "自动选择版本号最高的 APK 文件", + "pickHighestVersionCode": "自动选取内部版本号最高的 APK 文件", "checkUpdateOnDetailPage": "打开应用详情页时进行检查", "disablePageTransitions": "禁用页面过渡动画效果", "reversePageTransitions": "反转页面过渡动画效果", @@ -249,7 +249,7 @@ "intermediateLink": "中转链接", "exemptFromBackgroundUpdates": "禁用后台更新(如果已经全局启用)", "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新", - "autoSelectHighestVersionCode": "自动选择版本号最高的 APK 文件", + "autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件", "versionExtractionRegEx": "版本号提取规则(正则表达式)", "matchGroupToUse": "引用的捕获组", "highlightTouchTargets": "突出展示不明显的触摸区域", @@ -286,20 +286,20 @@ "shizukuBinderNotFound": "未发现兼容的 Shizuku 服务", "useSystemFont": "使用系统字体", "systemFontError": "加载系统字体出错:{}", - "useVersionCodeAsOSVersion": "使用应用程序版本代码作为操作系统检测到的版本", + "useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号", "requestHeader": "请求标头", - "useLatestAssetDateAsReleaseDate": "使用最新资产上传作为发布日期", - "defaultPseudoVersioningMethod": "默认伪版本控制方法", - "partialAPKHash": "部分 APK 哈希值", - "APKLinkHash": "APK 链接哈希", - "directAPKLink": "直接 APK 链接", - "pseudoVersionInUse": "伪版本正在使用", - "installed": "已安装", - "latest": "最新的", - "invertRegEx": "反转正则表达式", + "useLatestAssetDateAsReleaseDate": "使用最近文件上传时间作为发行日期", + "defaultPseudoVersioningMethod": "默认虚拟版本方案", + "partialAPKHash": "APK 文件散列值片段", + "APKLinkHash": "APK 文件链接散列值", + "directAPKLink": "APK 文件直链", + "pseudoVersionInUse": "正在使用虚拟版本号", + "installed": "当前版本", + "latest": "最新版本", + "invertRegEx": "反转匹配", "note": "备注", - "selfHostedNote": "{}\"下拉菜单可用于访问任何来源的自托管/自定义实例。", - "badDownload": "无法解析 APK(不兼容或部分下载)", + "selfHostedNote": "可以通过“{}”下拉菜单来指向任意来源的自托管/自定义实例。", + "badDownload": "无法解析 APK 文件(不兼容或文件不完整)", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" From 6d6afe9e697efa6fecd31ab91a0b8373c88ba1bf Mon Sep 17 00:00:00 2001 From: rollsicecream Date: Sun, 3 Mar 2024 13:08:00 +0100 Subject: [PATCH 28/58] Fix 'F-Droid' translation' in fr.json --- assets/translations/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/fr.json b/assets/translations/fr.json index f0fcc43..7a37fbb 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -167,7 +167,7 @@ "lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", "remove": "Retirer", "yesMarkUpdated": "Oui, marquer comme mis à jour", - "fdroid": "F-Droïde Officiel", + "fdroid": "F-Droid Officiel", "appIdOrName": "ID ou nom de l'application", "appId": "ID de l'application", "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", From 215f05fbc23b2ed5d386f9fe8fb929f664cf2518 Mon Sep 17 00:00:00 2001 From: dik08razz Date: Mon, 4 Mar 2024 18:14:37 +0200 Subject: [PATCH 29/58] add ukrainian --- assets/translations/uk.json | 359 ++++++++++++++++++++++++++++++++++++ lib/main.dart | 1 + 2 files changed, 360 insertions(+) create mode 100644 assets/translations/uk.json diff --git a/assets/translations/uk.json b/assets/translations/uk.json new file mode 100644 index 0000000..fd3365b --- /dev/null +++ b/assets/translations/uk.json @@ -0,0 +1,359 @@ +{ + "invalidURLForSource": "Неправильна URL-адреса для джерела застосунку {}", + "noReleaseFound": "Не вдалося знайти відповідне видання", + "noVersionFound": "Не вдалося визначити версію видання", + "urlMatchesNoSource": "URL не відповідає відомому джерелу", + "cantInstallOlderVersion": "Не можна встановити старішу версію застосунку", + "appIdMismatch": "Ідентифікатор пакета, завантажений, не відповідає ідентифікатору існуючого застосунку", + "functionNotImplemented": "Цей клас не реалізував цю функцію", + "placeholder": "Заповнювач", + "someErrors": "Виникла деяка помилка", + "unexpectedError": "Неочікувана помилка", + "ok": "Добре", + "and": "та", + "githubPATLabel": "Персональний ключ доступу GitHub (збільшує обмеження на швидкість)", + "includePrereleases": "Включити попередні видання", + "fallbackToOlderReleases": "Повернутися до старіших видань", + "filterReleaseTitlesByRegEx": "Фільтрувати заголовки видань за допомогою регулярного виразу", + "invalidRegEx": "Неприпустимий регулярний вираз", + "noDescription": "Немає опису", + "cancel": "Скасувати", + "continue": "Продовжити", + "requiredInBrackets": "(Обов'язково)", + "dropdownNoOptsError": "ПОМИЛКА: В ВИПАДАЮЧОМУ СПИСКУ МАЄ БУТИ ХОЧА Б ОДИН ЕЛЕМЕНТ", + "colour": "Колір", + "githubStarredRepos": "Відзначені репозиторії GitHub", + "uname": "Ім'я користувача", + "wrongArgNum": "Надано неправильну кількість аргументів", + "xIsTrackOnly": "{} - тільки відстежування", + "source": "Джерело", + "app": "застосунок", + "appsFromSourceAreTrackOnly": "Додатки з цього джерела є лише для відстежування.", + "youPickedTrackOnly": "Ви вибрали опцію лише для відстежування.", + "trackOnlyAppDescription": "Застосунок буде відстежуватися для оновлень, але Obtainium не зможе його завантажити або встановити.", + "cancelled": "Скасовано", + "appAlreadyAdded": "Застосунок вже додано", + "alreadyUpToDateQuestion": "Застосунок вже оновлено?", + "addApp": "Додати Застосунок", + "appSourceURL": "URL-адреса джерела застосунку", + "error": "Помилка", + "add": "Додати", + "searchSomeSourcesLabel": "Пошук (Лише деякі джерела)", + "search": "Пошук", + "additionalOptsFor": "Додаткові опції для {}", + "supportedSources": "Підтримувані джерела", + "trackOnlyInBrackets": "(Тільки для відстеження)", + "searchableInBrackets": "(Можливий пошук)", + "appsString": "Додатки", + "noApps": "Додатків немає", + "noAppsForFilter": "Додатків для фільтрації немає", + "byX": "За {}", + "percentProgress": "Прогрес: {}%", + "pleaseWait": "Будь ласка, зачекайте", + "updateAvailable": "Доступно оновлення", + "notInstalled": "Не встановлено", + "pseudoVersion": "псевдо-версія", + "selectAll": "Вибрати все", + "deselectX": "Скасувати вибір {}", + "xWillBeRemovedButRemainInstalled": "{} буде видалено з Obtainium, але залишиться встановленим на пристрої.", + "removeSelectedAppsQuestion": "Видалити вибрані додатки?", + "removeSelectedApps": "Видалити вибрані додатки", + "updateX": "Оновити {}", + "installX": "Встановити {}", + "markXTrackOnlyAsUpdated": "Позначити {}\n(Тільки відстежування)\nяк оновлено", + "changeX": "Змінити {}", + "installUpdateApps": "Встановити/Оновити додатки", + "installUpdateSelectedApps": "Встановити/Оновити вибрані додатки", + "markXSelectedAppsAsUpdated": "Позначити {} вибрані додатки як оновлені?", + "no": "Ні", + "yes": "Так", + "markSelectedAppsUpdated": "Позначити вибрані додатки як оновлені", + "pinToTop": "Закріпити угорі", + "unpinFromTop": "Відкріпити зверху", + "resetInstallStatusForSelectedAppsQuestion": "Скинути статус встановлення для вибраних додатків?", + "installStatusOfXWillBeResetExplanation": "Статус встановлення будь-яких вибраних додатків буде скинутий.\n\nЦе може допомогти, коли версія застосунку, відображена в Obtainium, є неправильною через невдалі оновлення або інші проблеми.", + "customLinkMessage": "Ці посилання працюють на пристроях з встановленим Obtainium", + "shareAppConfigLinks": "Поділитися посиланнями на конфігурацію Застосунку як HTML", + "shareSelectedAppURLs": "Поділитися вибраними URL-адресами додатків", + "resetInstallStatus": "Скинути статус встановлення", + "more": "Більше", + "removeOutdatedFilter": "Видалити фільтр застарілих додатків", + "showOutdatedOnly": "Показати лише застарілі додатки", + "filter": "Фільтр", + "filterApps": "Фільтрувати додатки", + "appName": "Назва застосунку", + "author": "Автор", + "upToDateApps": "Актуальні додатки", + "nonInstalledApps": "Невстановлені додатки", + "importExport": "Імпорт/Експорт", + "settings": "Налаштування", + "exportedTo": "Експортовано в {}", + "obtainiumExport": "Експорт з Obtainium", + "invalidInput": "Недійсний ввід", + "importedX": "Імпортовано {}", + "obtainiumImport": "Імпорт в Obtainium", + "importFromURLList": "Імпорт зі списку URL-адрес", + "searchQuery": "Пошуковий запит", + "appURLList": "Список URL-адрес додатків", + "line": "Лінія", + "searchX": "Пошук {}", + "noResults": "Результати відсутні", + "importX": "Імпорт {}", + "importedAppsIdDisclaimer": "Імпортовані додатки можуть неправильно відображатися як \"Не встановлені\".\nДля виправлення цього перевстановіть їх через Obtainium.\nЦе не повинно вплинути на дані додатків.\n\nПов'язано лише з URL-адресами та імпортом від третіх сторін.", + "importErrors": "Помилки імпорту", + "importedXOfYApps": "Імпортовано {} з {} додатків.", + "followingURLsHadErrors": "Помилки в наступних URL-адресах:", + "selectURL": "Вибрати URL", + "selectURLs": "Вибрати URL-адреси", + "pick": "Вибрати", + "theme": "Тема", + "dark": "Темна", + "light": "Світла", + "followSystem": "Дотримуватися системи", + "useBlackTheme": "Використовувати чисто чорну темну тему", + "appSortBy": "Сортувати додатки за", + "authorName": "Автор/Назва", + "nameAuthor": "Назва/Автор", + "asAdded": "За додаванням", + "appSortOrder": "Порядок сортування додатків", + "ascending": "За зростанням", + "descending": "За спаданням", + "bgUpdateCheckInterval": "Інтервал перевірки оновлень у фоновому режимі", + "neverManualOnly": "Ніколи - Тільки вручну", + "appearance": "Вигляд", + "showWebInAppView": "Показати джерело застосунку у вигляді веб-сторінки", + "pinUpdates": "Закріпити оновлення у верхній частині вигляду додатків", + "updates": "Оновлення", + "sourceSpecific": "Певне джерело", + "appSource": "Джерело застосунку", + "noLogs": "Немає логів", + "appLogs": "Лог застосунку", + "close": "Закрити", + "share": "Поділитися", + "appNotFound": "Застосунок не знайдено", + "obtainiumExportHyphenatedLowercase": "експорт з Obtainium", + "pickAnAPK": "Вибрати APK", + "appHasMoreThanOnePackage": "{} має більше одного пакету:", + "deviceSupportsXArch": "Ваш пристрій підтримує архітектуру процесора {}.", + "deviceSupportsFollowingArchs": "Ваш пристрій підтримує наступні архітектури процесора:", + "warning": "Попередження", + "sourceIsXButPackageFromYPrompt": "Джерело застосунку - '{}' але пакет випуску походить з '{}'. Продовжити?", + "updatesAvailable": "Доступні оновлення", + "updatesAvailableNotifDescription": "Повідомляє користувача, що доступні оновлення для одного чи декількох додатків, які відстежує Obtainium", + "noNewUpdates": "Немає нових оновлень.", + "xHasAnUpdate": "{} має оновлення.", + "appsUpdated": "Додатки оновлено", + "appsUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного чи декількох додатків було застосовано в фоновому режимі", + "xWasUpdatedToY": "{} було оновлено до {}.", + "errorCheckingUpdates": "Помилка перевірки оновлень", + "errorCheckingUpdatesNotifDescription": "Повідомлення, яке з'являється, коли перевірка оновлень в фоновому режимі завершується невдачею", + "appsRemoved": "Додатки видалено", + "appsRemovedNotifDescription": "Повідомляє користувача, що один чи декілька додатків були видалені через помилки при завантаженні", + "xWasRemovedDueToErrorY": "{} було видалено через цю помилку: {}", + "completeAppInstallation": "Завершення установки застосунку", + "obtainiumMustBeOpenToInstallApps": "Для встановлення додатків Obtainium має бути відкритий", + "completeAppInstallationNotifDescription": "Прохання користувача повернутися до Obtainium для завершення установки застосунку", + "checkingForUpdates": "Перевірка оновлень", + "checkingForUpdatesNotifDescription": "Тимчасове повідомлення, яке з'являється при перевірці оновлень", + "pleaseAllowInstallPerm": "Будь ласка, дозвольте Obtainium встановлювати додатки", + "trackOnly": "Тільки відстеження", + "errorWithHttpStatusCode": "Помилка {} HTTP-коду", + "versionCorrectionDisabled": "Виправлення версії вимкнено (здається, плагін не працює)", + "unknown": "Невідомо", + "none": "Нічого", + "never": "Ніколи", + "latestVersionX": "Остання версія: {}", + "installedVersionX": "Встановлено: {}", + "lastUpdateCheckX": "Остання перевірка оновлень: {}", + "remove": "Видалити", + "yesMarkUpdated": "Так, позначити як оновлене", + "fdroid": "F-Droid Офіційний", + "appIdOrName": "Ідентифікатор або назва застосунку", + "appId": "Ідентифікатор застосунку", + "appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено", + "reposHaveMultipleApps": "Сховища можуть містити кілька додатків", + "fdroidThirdPartyRepo": "F-Droid Стороннє сховище", + "steamMobile": "Мобільний Steam", + "steamChat": "Чат Steam", + "install": "Встановити", + "markInstalled": "Позначити як встановлене", + "update": "Оновити", + "markUpdated": "Позначити як оновлене", + "additionalOptions": "Додаткові опції", + "disableVersionDetection": "Вимкнути визначення версії", + "noVersionDetectionExplanation": "Цю опцію слід використовувати лише для додатків, де визначення версії працює неправильно.", + "downloadingX": "Завантаження {}", + "downloadNotifDescription": "Повідомляє користувача про прогрес завантаження застосунку", + "noAPKFound": "APK не знайдено", + "noVersionDetection": "Визначення версії відключено", + "categorize": "Категоризувати", + "categories": "Категорії", + "category": "Категорія", + "noCategory": "Без категорії", + "noCategories": "Немає категорій", + "deleteCategoriesQuestion": "Видалити категорії?", + "categoryDeleteWarning": "Усі додатки у видалених категоріях будуть переведені у некатегоризовані.", + "addCategory": "Додати категорію", + "label": "Мітка", + "language": "Мова", + "copiedToClipboard": "Скопійовано в буфер обміну", + "storagePermissionDenied": "Відмовлено у дозволі на доступ до сховища", + "selectedCategorizeWarning": "Це замінить будь-які існуючі налаштування категорій для вибраних додатків.", + "filterAPKsByRegEx": "Фільтрувати APK за регулярним виразом", + "removeFromObtainium": "Видалити з Obtainium", + "uninstallFromDevice": "Видалити з пристрою", + "onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.", + "releaseDateAsVersion": "Використовувати дату випуску як рядок версії", + "releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для додатків, де визначення версії працює неправильно, але є дата випуску.", + "changes": "Зміни", + "releaseDate": "Дата випуску", + "importFromURLsInFile": "Імпорт з URL-адрес у файлі (наприклад, OPML)", + "versionDetectionExplanation": "Порівняти рядок версії з версією, визначеною операційною системою", + "versionDetection": "Визначення версії", + "standardVersionDetection": "Стандартне визначення версії", + "groupByCategory": "Групувати за категоріями", + "autoApkFilterByArch": "Спробувати фільтрувати APK за архітектурою ЦП, якщо можливо", + "overrideSource": "Перевизначити джерело", + "dontShowAgain": "Не показувати це знову", + "dontShowTrackOnlyWarnings": "Не показувати попередження про 'Тільки відстеження'", + "dontShowAPKOriginWarnings": "Не показувати попередження про походження APK", + "moveNonInstalledAppsToBottom": "Перемістити невстановлені додатки вниз у перегляді додатків", + "gitlabPATLabel": "Особистий токен GitLab (Увімкнення пошуку та краще виявлення APK)", + "about": "Про програму", + "requiresCredentialsInSettings": "{} потребує додаткових облікових даних (у налаштуваннях)", + "checkOnStart": "Перевірити наявність оновлень при запуску", + "tryInferAppIdFromCode": "Спробувати вивести ідентифікатор застосунку з вихідного коду", + "removeOnExternalUninstall": "Автоматично видаляти додатки, які було видалено зовнішнім чином", + "pickHighestVersionCode": "Автоматично вибрати APK з найвищим кодом версії", + "checkUpdateOnDetailPage": "Перевіряти наявність оновлень при відкритті сторінки деталей застосунку", + "disablePageTransitions": "Вимкнути анімації переходів між сторінками", + "reversePageTransitions": "Зворотні анімації переходів між сторінками", + "minStarCount": "Мінімальна кількість зірок", + "addInfoBelow": "Додати цю інформацію нижче.", + "addInfoInSettings": "Додати цю інформацію у налаштуваннях.", + "githubSourceNote": "Лімітування швидкості GitHub можна уникнути, використовуючи ключ API.", + "gitlabSourceNote": "Вилучення APK з GitLab може не працювати без ключа API.", + "sortByLastLinkSegment": "Сортувати лише за останнім сегментом посилання", + "filterReleaseNotesByRegEx": "Фільтрувати примітки до релізу за регулярним виразом", + "customLinkFilterRegex": "Фільтр кастомного посилання на APK за регулярним виразом (за замовчуванням '.apk$')", + "appsPossiblyUpdated": "Оновлення додатків спробовано", + "appsPossiblyUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного або декількох додатків можливо були застосовані в фоновому режимі", + "xWasPossiblyUpdatedToY": "{} можливо було оновлено до {}.", + "enableBackgroundUpdates": "Увімкнути оновлення в фоновому режимі", + "backgroundUpdateReqsExplanation": "Оновлення в фоновому режимі може бути неможливим для всіх додатків.", + "backgroundUpdateLimitsExplanation": "Успіх фонової установки може бути визначений лише після відкриття Obtainium.", + "verifyLatestTag": "Перевірити тег 'latest'", + "intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування", + "filterByLinkText": "Фільтрувати посилання за текстом посилання", + "intermediateLinkNotFound": "Проміжне посилання не знайдено", + "intermediateLink": "Проміжне посилання", + "exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)", + "bgUpdatesOnWiFiOnly": "Вимкнути фонові оновлення поза Wi-Fi", + "autoSelectHighestVersionCode": "Автоматичний вибір APK з найвищим кодом версії", + "versionExtractionRegEx": "Регулярний вираз для вилучення рядка версії", + "matchGroupToUse": "Група співпадінь для використання в регулярному виразі вилучення версії", + "highlightTouchTargets": "Підсвічувати менш очевидні області дотику", + "pickExportDir": "Вибрати каталог експорту", + "autoExportOnChanges": "Автоматичний експорт при змінах", + "includeSettings": "Включити налаштування", + "filterVersionsByRegEx": "Фільтрувати версії за регулярним виразом", + "trySelectingSuggestedVersionCode": "Спробуйте вибрати запропонований код версії APK", + "dontSortReleasesList": "Зберігати порядок випуску з API", + "reverseSort": "Зворотне сортування", + "takeFirstLink": "Вибрати перше посилання", + "skipSort": "Пропустити сортування", + "debugMenu": "Меню налагодження", + "bgTaskStarted": "Запущено фонове завдання - перевірте журнали.", + "runBgCheckNow": "Запустити перевірку оновлень в фоновому режимі зараз", + "versionExtractWholePage": "Застосувати регулярний вираз вилучення версії до всієї сторінки", + "installing": "Встановлення", + "skipUpdateNotifications": "Пропустити сповіщення про оновлення", + "updatesAvailableNotifChannel": "Доступні оновлення", + "appsUpdatedNotifChannel": "Додатки оновлені", + "appsPossiblyUpdatedNotifChannel": "Спроба оновлення додатків", + "errorCheckingUpdatesNotifChannel": "Помилка перевірки оновлень", + "appsRemovedNotifChannel": "Додатки видалені", + "downloadingXNotifChannel": "Завантаження {}", + "completeAppInstallationNotifChannel": "Завершення встановлення застосунку", + "checkingForUpdatesNotifChannel": "Перевірка оновлень", + "onlyCheckInstalledOrTrackOnlyApps": "Перевіряти лише встановлені та додатки, які відстежуються для оновлень", + "supportFixedAPKURL": "Підтримка фіксованих посилань на APK", + "selectX": "Вибрати {}", + "parallelDownloads": "Дозволити паралельні завантаження", + "installMethod": "Метод встановлення", + "normal": "Звичайний", + "root": "Root", + "shizukuBinderNotFound": "Сумісний сервіс Shizuku не було знайдено", + "useSystemFont": "Використовувати системний шрифт", + "systemFontError": "Помилка завантаження системного шрифту: {}", + "useVersionCodeAsOSVersion": "Використовувати код версії застосунку як версію, визначену операційною системою", + "requestHeader": "Заголовок запиту", + "useLatestAssetDateAsReleaseDate": "Використовувати останню дату завантаження ресурсу як дату випуску", + "defaultPseudoVersioningMethod": "Метод за замовчуванням псевдо-версіонування", + "partialAPKHash": "Хеш часткового APK", + "APKLinkHash": "Хеш посилання на APK", + "directAPKLink": "Пряме посилання на APK", + "pseudoVersionInUse": "Використовується псевдо-версія", + "installed": "Встановлено", + "latest": "Остання", + "invertRegEx": "Інвертувати регулярний вираз", + "note": "Примітка", + "selfHostedNote": "Випадаючий список \"{}\" може використовуватися для доступу до власних/призначених для самостійного використання екземплярів будь-якого джерела.", + "badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)", + "removeAppQuestion": { + "one": "Видалити Застосунок?", + "other": "Видалити додатки?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилину", + "other": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилин" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилину", + "other": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилин" + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "Фонова перевірка оновлень знайшла {} оновлення - сповістить користувача, якщо це необхідно", + "other": "Фонова перевірка оновлень знайшла {} оновлень - сповістить користувача, якщо це необхідно" + }, + "apps": { + "one": "{} Застосунок", + "other": "{} Додатки" + }, + "url": { + "one": "{} URL", + "other": "{} URL-адреси" + }, + "minute": { + "one": "{} Хвилина", + "other": "{} Хвилин" + }, + "hour": { + "one": "{} Година", + "other": "{} Годин" + }, + "day": { + "one": "{} День", + "other": "{} Днів" + }, + "clearedNLogsBeforeXAfterY": { + "one": "Очищено {n} журнал (до = {before}, після = {after})", + "other": "Очищено {n} журналів (до = {before}, після = {after})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "{} і 1 інше Застосунок мають оновлення.", + "other": "{} і {} інших додатки мають оновлення." + }, + "xAndNMoreUpdatesInstalled": { + "one": "{} і 1 інше Застосунок було оновлено.", + "other": "{} і {} інших додатків було оновлено." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} і 1 інше Застосунок можливо було оновлено.", + "other": "{} і {} інших додатків можливо було оновлено." + }, + "apk": { + "one": "{} APK", + "other": "{} APK-файли" + } +} diff --git a/lib/main.dart b/lib/main.dart index 3b7abda..32f2c0b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,6 +38,7 @@ List> supportedLocales = const [ MapEntry(Locale('nl'), 'Nederlands'), MapEntry(Locale('vi'), 'Tiếng Việt'), MapEntry(Locale('tr'), 'Türkçe'), + MapEntry(Locale('uk'), 'Українська'), ]; const fallbackLocale = Locale('en'); const localeDir = 'assets/translations'; From 7f4cf6e6811c5a41c995377d1165ca2fd2a750f0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Tue, 5 Mar 2024 10:37:36 -0500 Subject: [PATCH 30/58] Fix bug in GitHub's 'verify latest' option (#1449) --- lib/app_sources/github.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 251a118..96cd8b3 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -343,13 +343,14 @@ class GitHub extends AppSource { } }); } - if (latestRelease != null && + if ((latestRelease['tag_name'] ?? latestRelease['name']) != null && releases.isNotEmpty && latestRelease != (releases[releases.length - 1]['tag_name'] ?? releases[0]['name'])) { var ind = releases.indexWhere((element) => - latestRelease == (element['tag_name'] ?? element['name'])); + (latestRelease['tag_name'] ?? latestRelease['name']) == + (element['tag_name'] ?? element['name'])); if (ind >= 0) { releases.add(releases.removeAt(ind)); } From a9159fc8a0cea79f8d3d5801f68a13122107d9bb Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 9 Mar 2024 09:23:48 +0100 Subject: [PATCH 31/58] Remove .apk retrieval from tags-feed So this code does focus on the official Gitlab REST API. With this the retrieval logic changes. --- lib/app_sources/gitlab.dart | 113 ++++++++++++------------------------ 1 file changed, 36 insertions(+), 77 deletions(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 3e1e701..dac4469 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -113,84 +113,43 @@ class GitLab extends AppSource { additionalSettings['fallbackToOlderReleases'] == true; String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); Iterable apkDetailsList = []; - if (PAT != null) { - var names = GitHub().getAppNames(standardUrl); - Response res = await sourceRequest( - 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT', - additionalSettings); - if (res.statusCode != 200) { - throw getObtainiumHttpError(res); - } - var json = jsonDecode(res.body) as List; - apkDetailsList = json.map((e) { - var apkUrlsFromAssets = (e['assets']?['links'] as List? ?? []) - .map((e) { - return (e['direct_asset_url'] ?? e['url'] ?? '') as String; - }) - .where((s) => s.isNotEmpty) - .toList(); - List uploadedAPKsFromDescription = - ((e['description'] ?? '') as String) - .split('](') - .join('\n') - .split('.apk)') - .join('.apk\n') - .split('\n') - .where((s) => s.startsWith('/uploads/') && s.endsWith('apk')) - .map((s) => '$standardUrl$s') - .toList(); - var apkUrlsSet = apkUrlsFromAssets.toSet(); - apkUrlsSet.addAll(uploadedAPKsFromDescription); - var releaseDateString = e['released_at'] ?? e['created_at']; - DateTime? releaseDate = releaseDateString != null - ? DateTime.parse(releaseDateString) - : null; - return APKDetails( - e['tag_name'] ?? e['name'], - getApkUrlsFromUrls(apkUrlsSet.toList()), - GitHub().getAppNames(standardUrl), - releaseDate: releaseDate); - }); - } else { - Response res = await sourceRequest( - '$standardUrl/-/tags?format=atom', additionalSettings); - if (res.statusCode != 200) { - throw getObtainiumHttpError(res); - } - var standardUri = Uri.parse(standardUrl); - var parsedHtml = parse(res.body); - apkDetailsList = parsedHtml.querySelectorAll('entry').map((entry) { - var entryContent = parse( - parseFragment(entry.querySelector('content')!.innerHtml).text); - var apkUrls = [ - ...getLinksFromParsedHTML( - entryContent, - RegExp( - '^${standardUri.path.replaceAllMapped(RegExp(r'[.*+?^${}()|[\]\\]'), (x) { - return '\\${x[0]}'; - })}/uploads/[^/]+/[^/]+\\.apk\$', - caseSensitive: false), - standardUri.origin), - // GitLab releases may contain links to externally hosted APKs - ...getLinksFromParsedHTML(entryContent, - RegExp('/[^/]+\\.apk\$', caseSensitive: false), '') - .where((element) => Uri.parse(element).host != '') - ]; - var entryId = entry.querySelector('id')?.innerHtml; - var version = - entryId == null ? null : Uri.parse(entryId).pathSegments.last; - var releaseDateString = entry.querySelector('updated')?.innerHtml; - DateTime? releaseDate = releaseDateString != null - ? DateTime.parse(releaseDateString) - : null; - if (version == null) { - throw NoVersionError(); - } - return APKDetails(version, getApkUrlsFromUrls(apkUrls), - GitHub().getAppNames(standardUrl), - releaseDate: releaseDate); - }); + var names = GitHub().getAppNames(standardUrl); + Response res = await sourceRequest( + 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT', + additionalSettings); + if (res.statusCode != 200) { + throw getObtainiumHttpError(res); } + var json = jsonDecode(res.body) as List; + apkDetailsList = json.map((e) { + var apkUrlsFromAssets = (e['assets']?['links'] as List? ?? []) + .map((e) { + return (e['direct_asset_url'] ?? e['url'] ?? '') as String; + }) + .where((s) => s.isNotEmpty) + .toList(); + List uploadedAPKsFromDescription = + ((e['description'] ?? '') as String) + .split('](') + .join('\n') + .split('.apk)') + .join('.apk\n') + .split('\n') + .where((s) => s.startsWith('/uploads/') && s.endsWith('apk')) + .map((s) => '$standardUrl$s') + .toList(); + var apkUrlsSet = apkUrlsFromAssets.toSet(); + apkUrlsSet.addAll(uploadedAPKsFromDescription); + var releaseDateString = e['released_at'] ?? e['created_at']; + DateTime? releaseDate = releaseDateString != null + ? DateTime.parse(releaseDateString) + : null; + return APKDetails( + e['tag_name'] ?? e['name'], + getApkUrlsFromUrls(apkUrlsSet.toList()), + GitHub().getAppNames(standardUrl), + releaseDate: releaseDate); + }); if (apkDetailsList.isEmpty) { throw NoReleasesError(note: tr('gitlabSourceNote')); } From 3824b386d7a51207fcb68114be85f2698e778d0f Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 9 Mar 2024 10:11:54 +0100 Subject: [PATCH 32/58] Regroup functions by their intention This may prepare for later refactorings and code simplification --- lib/app_sources/gitlab.dart | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index dac4469..df200f7 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -109,17 +109,20 @@ class GitLab extends AppSource { String standardUrl, Map additionalSettings, ) async { - bool fallbackToOlderReleases = - additionalSettings['fallbackToOlderReleases'] == true; - String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); - Iterable apkDetailsList = []; + // Prepare request params var names = GitHub().getAppNames(standardUrl); + String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); + + // Request data from REST API Response res = await sourceRequest( 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT', additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); } + + // Extract .apk details from received data + Iterable apkDetailsList = []; var json = jsonDecode(res.body) as List; apkDetailsList = json.map((e) { var apkUrlsFromAssets = (e['assets']?['links'] as List? ?? []) @@ -153,6 +156,10 @@ class GitLab extends AppSource { if (apkDetailsList.isEmpty) { throw NoReleasesError(note: tr('gitlabSourceNote')); } + + // Fallback procedure + bool fallbackToOlderReleases = + additionalSettings['fallbackToOlderReleases'] == true; if (fallbackToOlderReleases) { if (additionalSettings['trackOnly'] != true) { apkDetailsList = @@ -162,6 +169,7 @@ class GitLab extends AppSource { throw NoReleasesError(note: tr('gitlabSourceNote')); } } + return apkDetailsList.first; } } From bb1dd4ecfd8a0f7bcc024cb5e049397c1aa2a80b Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 9 Mar 2024 10:16:54 +0100 Subject: [PATCH 33/58] Inject Private Access Token as optional request param It turned out: If the parameter `private_token` is given but empty, the Gitlab REST API does expect a valid access token otherwise responds with an authorization error --- lib/app_sources/gitlab.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index df200f7..cf33826 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -112,10 +112,11 @@ class GitLab extends AppSource { // Prepare request params var names = GitHub().getAppNames(standardUrl); String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); + String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; // Request data from REST API Response res = await sourceRequest( - 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT', + 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?$optionalAuth', additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); From d8cd3b6c9258a17749efcbe14fb352c76f394a2d Mon Sep 17 00:00:00 2001 From: Achim Date: Sat, 9 Mar 2024 10:17:27 +0100 Subject: [PATCH 34/58] Remove unused package import --- lib/app_sources/gitlab.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index cf33826..f3c21ae 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/custom_errors.dart'; From e7c2112f417c3f079d6ad5782cf7c8ff3f9bbb4e Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 9 Mar 2024 13:50:22 -0500 Subject: [PATCH 35/58] Bugfix from prev. commit --- lib/app_sources/github.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index 96cd8b3..f6e2615 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -343,7 +343,8 @@ class GitHub extends AppSource { } }); } - if ((latestRelease['tag_name'] ?? latestRelease['name']) != null && + if (latestRelease != null && + (latestRelease['tag_name'] ?? latestRelease['name']) != null && releases.isNotEmpty && latestRelease != (releases[releases.length - 1]['tag_name'] ?? From 4902e0ef06726a525d7ebf07886a62c25af82497 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 9 Mar 2024 14:17:18 -0500 Subject: [PATCH 36/58] Removed outdated translations related to #1459 --- assets/translations/bs.json | 3 +-- assets/translations/cs.json | 3 +-- assets/translations/de.json | 3 +-- assets/translations/en.json | 3 +-- assets/translations/es.json | 3 +-- assets/translations/fa.json | 3 +-- assets/translations/fr.json | 3 +-- assets/translations/hu.json | 3 +-- assets/translations/it.json | 3 +-- assets/translations/ja.json | 3 +-- assets/translations/nl.json | 3 +-- assets/translations/pl.json | 3 +-- assets/translations/pt.json | 3 +-- assets/translations/ru.json | 3 +-- assets/translations/sv.json | 3 +-- assets/translations/tr.json | 3 +-- assets/translations/vi.json | 3 +-- assets/translations/zh.json | 3 +-- lib/app_sources/gitlab.dart | 12 ++---------- 19 files changed, 20 insertions(+), 46 deletions(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 044fbd2..294654e 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za praćenje”", "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", - "gitlabPATLabel": "GitLab token za lični pristup\n(Omogućava pretraživanje i bolje otkrivanje APK-a)", + "gitlabPATLabel": "GitLab token za lični pristup", "about": "O nama", "requiresCredentialsInSettings": "{}: Za ovo su potrebni dodatni akreditivi (u Postavkama)", "checkOnStart": "Provjerite ima li novosti pri pokretanju", @@ -232,7 +232,6 @@ "addInfoBelow": "Dodajte ove informacije ispod.", "addInfoInSettings": "Dodajte ove informacije u Postavkama.", "githubSourceNote": "GitHub ograničavanje se može izbjeći korišćenjem tokena za lični pristup.", - "gitlabSourceNote": "GitLab APK preuzimanje možda neće raditi bez tokena za lični pristup.", "sortByLastLinkSegment": "Sortiraj samo po zadnjem segmentu veze", "filterReleaseNotesByRegEx": "Filtirajte promjene u izdanju po regularnom izrazu", "customLinkFilterRegex": "Prilagođeni APK link filtrira se po regularnom izrazu (Zadano '.apk$')", diff --git a/assets/translations/cs.json b/assets/translations/cs.json index aa061bb..f403304 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'", "dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK", "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace", - "gitlabPATLabel": "GitLab Personal Access Token\n(Umožňuje vyhledávání a lepší zjišťování APK)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "O", "requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)", "checkOnStart": "Zkontrolovat jednou při spuštění", @@ -232,7 +232,6 @@ "addInfoBelow": "Přidat tuto informaci na konec stránky.", "addInfoInSettings": "Přidat tuto informaci do nastavení.", "githubSourceNote": "Omezení rychlosti GitHub lze obejít pomocí klíče API.", - "gitlabSourceNote": "Extrakce GitLab APK nemusí fungovat bez klíče API", "sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu", "filterReleaseNotesByRegEx": "Filtrovat poznámky k vydání podle regulárního výrazu", "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')", diff --git a/assets/translations/de.json b/assets/translations/de.json index cc41601..40d2315 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Warnung für 'Nur Nachverfolgen' nicht anzeigen", "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der Apps Ansicht verschieben", - "gitlabPATLabel": "GitLab Personal Access Token\n(Aktiviert Suche und bessere APK Entdeckung)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "Über", "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", "checkOnStart": "Überprüfe einmalig beim Start", @@ -232,7 +232,6 @@ "addInfoBelow": "Fügen Sie diese Informationen unten hinzu.", "addInfoInSettings": "Fügen Sie diese Info in den Einstellungen hinzu.", "githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.", - "gitlabSourceNote": "GitLab APK-Extraktion funktioniert möglicherweise nicht ohne API-Schlüssel", "sortByLastLinkSegment": "Sortiere nur nach dem letzten Teil des Links", "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", "customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')", diff --git a/assets/translations/en.json b/assets/translations/en.json index df464bd..f6220bb 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Don't show 'Track-Only' warnings", "dontShowAPKOriginWarnings": "Don't show APK origin warnings", "moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", - "gitlabPATLabel": "GitLab Personal Access Token\n(Enables Search and Better APK Discovery)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "About", "requiresCredentialsInSettings": "{} needs additional credentials (in Settings)", "checkOnStart": "Check for updates on startup", @@ -232,7 +232,6 @@ "addInfoBelow": "Add this info below.", "addInfoInSettings": "Add this info in the Settings.", "githubSourceNote": "GitHub rate limiting can be avoided using an API key.", - "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", "sortByLastLinkSegment": "Sort by only the last segment of the link", "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", diff --git a/assets/translations/es.json b/assets/translations/es.json index da5cbd2..0f512e8 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps en 'solo seguimiento'", "dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs", "moveNonInstalledAppsToBottom": "Mover Apps no instaladas al final", - "gitlabPATLabel": "Token de acceso personal a GitLab\n(habilita la búsqueda y mejor detección de APKs)", + "gitlabPATLabel": "Token de acceso personal a GitLab", "about": "Acerca", "requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)", "checkOnStart": "Comprobar actualizaciones al inicio", @@ -232,7 +232,6 @@ "addInfoBelow": "Añadir esta información debajo.", "addInfoInSettings": "Puede añadir esta información en Ajustes.", "githubSourceNote": "La limitación de velocidad de GitHub puede evitarse con un 'token de acceso personal'.", - "gitlabSourceNote": "La extracción de APK de GitLab podría no funcionar sin un 'token de acceso personal'.", "sortByLastLinkSegment": "Ordenar sólo por el último segmento del enlace", "filterReleaseNotesByRegEx": "Filtrar por notas de versión (release notes)", "customLinkFilterRegex": "Filtro personalizado de enlace APK (por defecto '.apk$')", diff --git a/assets/translations/fa.json b/assets/translations/fa.json index eb9124f..7929634 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "هشدار 'فقط ردیابی' را نشان ندهید", "dontShowAPKOriginWarnings": "هشدارهای منبع APK را نشان ندهید", "moveNonInstalledAppsToBottom": "برنامه های نصب نشده را به نمای پایین برنامه ها منتقل کنید", - "gitlabPATLabel": "رمز دسترسی شخصی GitLab\n(جستجو و کشف بهتر APK را فعال میکند)", + "gitlabPATLabel": "رمز دسترسی شخصی GitLab", "about": "درباره", "requiresCredentialsInSettings": "{}: این به اعتبارنامه های اضافی نیاز دارد (در تنظیمات)", "checkOnStart": "بررسی در شروع", @@ -232,7 +232,6 @@ "addInfoBelow": "این اطلاعات را در زیر اضافه کنید", "addInfoInSettings": "این اطلاعات را در تنظیمات اضافه کنید.", "githubSourceNote": "با استفاده از کلید API می توان از محدودیت نرخ GitHub جلوگیری کرد.", - "gitlabSourceNote": "استخراج APK GitLab ممکن است بدون کلید API کار نکند.", "sortByLastLinkSegment": "فقط بر اساس آخرین بخش پیوند مرتب کنید", "filterReleaseNotesByRegEx": "یادداشت های انتشار را با بیان منظم فیلتر کنید", "customLinkFilterRegex": "فیلتر پیوند سفارشی بر اساس عبارت منظم (پیش‌فرض '.apk$')", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index f0fcc43..c09de3b 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Don't Show the 'Track-Only' Warning", "dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK", "moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications", - "gitlabPATLabel": "Jeton d'accès personnel GitLab\\n (permet la recherche et une meilleure découverte d'APK)", + "gitlabPATLabel": "Jeton d'accès personnel GitLab", "about": "À propos de", "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", "checkOnStart": "Vérifier les mises à jour au démarrage", @@ -232,7 +232,6 @@ "addInfoBelow": "Ajoutez ces informations ci-dessous.", "addInfoInSettings": "Ajoutez ces informations dans les paramètres.", "githubSourceNote": "La limitation du débit GitHub peut être évitée à l'aide d'une clé API.", - "gitlabSourceNote": "L'extraction d'APK GitLab peut ne pas fonctionner sans clé API.", "sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien", "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière", "customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')", diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 2a99639..a7ead85 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", - "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "Rólunk", "requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", "checkOnStart": "Egyszer az alkalmazás indításakor is", @@ -232,7 +232,6 @@ "addInfoBelow": "Adja hozzá ezt az infót alább.", "addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", "githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", - "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", "sortByLastLinkSegment": "Rendezés csak a link utolsó szegmense szerint", "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", "customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')", diff --git a/assets/translations/it.json b/assets/translations/it.json index eae443a..2e4b0d1 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'", "dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK", "moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista", - "gitlabPATLabel": "GitLab Personal Access Token\n(attiva la ricerca e migliora la rilevazione di apk)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "Informazioni", "requiresCredentialsInSettings": "{}: Servono credenziali aggiuntive (in Impostazioni)", "checkOnStart": "Controlla una volta all'avvio", @@ -232,7 +232,6 @@ "addInfoBelow": "Aggiungi questa info sotto.", "addInfoInSettings": "Aggiungi questa info nelle impostazioni.", "githubSourceNote": "Il limite di ricerca GitHub può essere evitato usando una chiave API.", - "gitlabSourceNote": "L'estrazione di APK da GitLab potrebbe non funzionare senza chiave API.", "sortByLastLinkSegment": "Ordina solo in base all'ultimo segmento del collegamento", "filterReleaseNotesByRegEx": "Filtra le note di rilascio con espressione regolare", "customLinkFilterRegex": "Filtra link APK personalizzato con espressione regolare (predefinito '.apk$')", diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 9694ea9..af5db0c 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない", "dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない", "moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる", - "gitlabPATLabel": "GitLab パーソナルアクセストークン\n(検索とより良いAPK検出の有効化)", + "gitlabPATLabel": "GitLab パーソナルアクセストークン", "about": "概要", "requiresCredentialsInSettings": "{}: これには追加の認証が必要です (設定にて)", "checkOnStart": "起動時にアップデートを確認する", @@ -232,7 +232,6 @@ "addInfoBelow": "下部でこの情報を追加してください。", "addInfoInSettings": "設定でこの情報を追加してください。", "githubSourceNote": "GitHubのレート制限はAPIキーを使うことで回避できます。", - "gitlabSourceNote": "GitLabのAPK抽出はAPIキーがないと動作しない場合があります。", "sortByLastLinkSegment": "リンクの最後のセグメントのみでソートする", "filterReleaseNotesByRegEx": "正規表現でリリースノートをフィルタリングする", "customLinkFilterRegex": "正規表現によるカスタムリンクフィルター (デフォルト '.apk$')", diff --git a/assets/translations/nl.json b/assets/translations/nl.json index ca29402..f946b5a 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Geen waarschuwingen voor 'Track-Only' weergeven", "dontShowAPKOriginWarnings": "APK-herkomstwaarschuwingen niet weergeven", "moveNonInstalledAppsToBottom": "Verplaats niet-geïnstalleerde apps naar de onderkant van de apps-weergave", - "gitlabPATLabel": "GitLab Personal Access Token\n(Maakt het mogelijk beter te zoeken naar APK's)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "Over", "requiresCredentialsInSettings": "{}: Dit vereist aanvullende referenties (in Instellingen)", "checkOnStart": "Controleren op updates bij opstarten", @@ -232,7 +232,6 @@ "addInfoBelow": "Voeg deze informatie hieronder toe.", "addInfoInSettings": "Voeg deze informatie toe in de instellingen.", "githubSourceNote": "Beperkingen van GitHub kunnen worden vermeden door het gebruik van een API-sleutel.", - "gitlabSourceNote": "GitLab APK-extractie werkt mogelijk niet zonder een API-sleutel.", "sortByLastLinkSegment": "Sorteren op alleen het laatste segment van de link", "filterReleaseNotesByRegEx": "Filter release-opmerkingen met een reguliere expressie.", "customLinkFilterRegex": "Aangepaste APK-linkfilter met een reguliere expressie (Standaard '.apk$').", diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 983ab0b..f24aceb 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Nie pokazuj ostrzeżeń \"Tylko obserwowana\"", "dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK", "moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji", - "gitlabPATLabel": "Osobisty token dostępu GitLab\n(Umożliwia wyszukiwanie i lepsze wykrywanie APK)", + "gitlabPATLabel": "Osobisty token dostępu GitLab", "about": "Więcej informacji", "requiresCredentialsInSettings": "{}: Wymaga to dodatkowych poświadczeń (w Ustawieniach)", "checkOnStart": "Sprawdź aktualizacje przy uruchomieniu", @@ -232,7 +232,6 @@ "addInfoBelow": "Dodaj tę informację poniżej.", "addInfoInSettings": "Dodaj tę informację w Ustawieniach.", "githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.", - "gitlabSourceNote": "Pozyskiwanie pliku APK z GitLab może nie działać bez klucza API.", "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza", "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 8f9558b..2473c73 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'", "dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK", "moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos", - "gitlabPATLabel": "Token de acesso pessoal do Gitlab\n(Ativa pesquisa e melhora a descoberta de APKs)", + "gitlabPATLabel": "Token de acesso pessoal do Gitlab", "about": "Sobre", "requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)", "checkOnStart": "Verificar se há atualizações ao iniciar", @@ -232,7 +232,6 @@ "addInfoBelow": "Adicionar essa informação abaixo.", "addInfoInSettings": "Adicionar essa informação nas configurações.", "githubSourceNote": "A limitação de taxa do GitHub pode ser evitada usando uma chave de API.", - "gitlabSourceNote": "A extração de endereço de download do APK no GitLab provavelmente não funcione sem que seja fornecido uma chave de API.", "sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link", "filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex", "customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')", diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 3b7c7d6..52a42fb 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях", "dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов", "moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка", - "gitlabPATLabel": "Персональный токен доступа GitLab\n(включает поиск и улучшает обнаружение APK)", + "gitlabPATLabel": "Персональный токен доступа GitLab", "about": "Описание", "requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)", "checkOnStart": "Проверять наличие обновлений при запуске", @@ -232,7 +232,6 @@ "addInfoBelow": "Добавьте эту информацию ниже", "addInfoInSettings": "Добавьте эту информацию в Настройки", "githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub", - "gitlabSourceNote": "Без ключа API может не работать извлечение APK с GitLab", "sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки", "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)", "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.apk$')", diff --git a/assets/translations/sv.json b/assets/translations/sv.json index cd6efc6..44baa29 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Visa inte 'Följ-Endast' varningar", "dontShowAPKOriginWarnings": "Visa inte APK-ursprung varningar", "moveNonInstalledAppsToBottom": "Flytta icke-installerade appar till botten av appvyn", - "gitlabPATLabel": "GitLab Personal Access Token\\n(Möjliggör sökning och bättre APK-upptäckt)", + "gitlabPATLabel": "GitLab Personal Access Token", "about": "Om", "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", "checkOnStart": "Kolla efter uppdateringar vid start", @@ -232,7 +232,6 @@ "addInfoBelow": "Lägg till denna information nedanför.", "addInfoInSettings": "Lägg till denna information i Inställningar.", "githubSourceNote": "GitHub-hastighetsbegränsning kan undvikas med en API-nyckel.", - "gitlabSourceNote": "GitLab APK-extraktion kanske inte fungerar utan en API-nyckel.", "sortByLastLinkSegment": "Sortera endast efter det sista segmentet av länken", "filterReleaseNotesByRegEx": "Filtrera versionskommentarer efter reguljärt uttryck", "customLinkFilterRegex": "Anpassad APK-länkfiltrera efter reguljärt uttryck (standard '.apk$')", diff --git a/assets/translations/tr.json b/assets/translations/tr.json index 526af9d..240a0c1 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme", "dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme", "moveNonInstalledAppsToBottom": "Yüklenmemiş Uygulamaları Uygulamalar Görünümünün Altına Taşı", - "gitlabPATLabel": "GitLab Kişisel Erişim Belirteci\n(Arama ve Daha İyi APK Keşfi İçin)", + "gitlabPATLabel": "GitLab Kişisel Erişim Belirteci", "about": "Hakkında", "requiresCredentialsInSettings": "{}: Bu, ek kimlik bilgilerine ihtiyaç duyar (Ayarlar'da)", "checkOnStart": "Başlangıçta güncellemeleri kontrol et", @@ -232,7 +232,6 @@ "addInfoBelow": "Bu bilgiyi aşağıya ekle.", "addInfoInSettings": "Bu bilgiyi Ayarlar'da ekleyin.", "githubSourceNote": "GitHub hız sınırlaması bir API anahtarı kullanılarak atlanabilir.", - "gitlabSourceNote": "GitLab APK çıkarma işlemi bir API anahtarı olmadan çalışmayabilir.", "sortByLastLinkSegment": "Bağlantının yalnızca son bölümüne göre sırala", "filterReleaseNotesByRegEx": "Sürüm Notlarını Düzenli İfade ile Filtrele", "customLinkFilterRegex": "Özel APK Bağlantı Filtresi Düzenli İfade ile (Varsayılan '.apk$')", diff --git a/assets/translations/vi.json b/assets/translations/vi.json index a89ea7d..51b1f4f 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Không hiển thị cảnh báo 'Chỉ theo dõi'", "dontShowAPKOriginWarnings": "Không hiển thị cảnh báo nguồn gốc APK", "moveNonInstalledAppsToBottom": "Chuyển Ứng dụng chưa được cài đặt xuống cuối danh sách", - "gitlabPATLabel": "GitLab Token\n(Cho phép tìm kiếm và lọc APK tốt hơn)", + "gitlabPATLabel": "GitLab Token", "about": "Giới thiệu", "requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)", "checkOnStart": "Kiểm tra các bản cập nhật khi khởi động", @@ -232,7 +232,6 @@ "addInfoBelow": "Thêm thông tin này vào bên dưới.", "addInfoInSettings": "Thêm thông tin này vào Thiết đặt.", "githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.", - "gitlabSourceNote": "Trích xuất APK GitLab có thể không hoạt động nếu không có khóa API.", "sortByLastLinkSegment": "Chỉ sắp xếp theo đoạn cuối của liên kết", "filterReleaseNotesByRegEx": "Lọc ghi chú phát hành theo biểu thức chính quy", "customLinkFilterRegex": "Bộ lọc liên kết APK tùy chỉnh theo biểu thức chính quy (Mặc định '.apk$')", diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 9ebe167..74c306a 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "忽略“仅追踪”模式警告", "dontShowAPKOriginWarnings": "忽略 APK 文件来源警告", "moveNonInstalledAppsToBottom": "将未安装应用置底", - "gitlabPATLabel": "GitLab 个人访问令牌(启用搜索功能并增强 APK 发现)", + "gitlabPATLabel": "GitLab 个人访问令牌", "about": "相关文档", "requiresCredentialsInSettings": "{}:此功能需要额外的凭据(在“设置”中添加)", "checkOnStart": "启动时进行一次检查", @@ -232,7 +232,6 @@ "addInfoBelow": "在下方添加此凭据。", "addInfoInSettings": "在“设置”中添加此凭据。", "githubSourceNote": "使用访问令牌可避免触发 GitHub 的 API 请求限制。", - "gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。", "sortByLastLinkSegment": "仅根据链接的末尾部分进行筛选", "filterReleaseNotesByRegEx": "筛选发行说明(正则表达式)", "customLinkFilterRegex": "筛选自定义来源的 APK 文件链接\n(正则表达式,默认匹配模式为“.apk$”)", diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 8edf359..601edb4 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -73,14 +73,6 @@ class GitLab extends AppSource { return creds != null && creds.isNotEmpty ? creds : null; } - @override - Future getSourceNote() async { - if ((await getPATIfAny({})) == null) { - return '${tr('gitlabSourceNote')} ${hostChanged ? tr('addInfoBelow') : tr('addInfoInSettings')}'; - } - return null; - } - @override Future>> search(String query, {Map querySettings = const {}}) async { @@ -208,7 +200,7 @@ class GitLab extends AppSource { }); } if (apkDetailsList.isEmpty) { - throw NoReleasesError(note: tr('gitlabSourceNote')); + throw NoReleasesError(); } if (fallbackToOlderReleases) { if (additionalSettings['trackOnly'] != true) { @@ -216,7 +208,7 @@ class GitLab extends AppSource { apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); } if (apkDetailsList.isEmpty) { - throw NoReleasesError(note: tr('gitlabSourceNote')); + throw NoReleasesError(); } } return apkDetailsList.first; From b6e65685001e72aae3f32178b3918cbf73f05c82 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 9 Mar 2024 14:24:13 -0500 Subject: [PATCH 37/58] Increment version, upgrade Flutter + packages --- .flutter | 2 +- pubspec.lock | 32 ++++++++++++++++---------------- pubspec.yaml | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.flutter b/.flutter index 7482962..ba39319 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit 7482962148e8d758338d8a28f589f317e1e42ba4 +Subproject commit ba393198430278b6595976de84fe170f553cc728 diff --git a/pubspec.lock b/pubspec.lock index ea9066a..fa08f4a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -38,10 +38,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: "4e392b5eba997df356ca6021f28431ce1cfeb16758699553a94b13add874a3bb" + sha256: "3ced568a5d9e309e99af71285666f1f3117bddd0bd5b3317979dccc1a40cada4" url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.5.1" archive: dependency: transitive description: @@ -70,10 +70,10 @@ packages: dependency: "direct main" description: name: background_fetch - sha256: "1a7868d9bd165eb177f039ff8244cfa7952340b18f7caabf322b26e712b438a3" + sha256: eb3af263d390d7e68ecb90f2ae984d2bfd96dceb4c7b4f72418dd5383b49de0a url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.4" boolean_selector: dependency: transitive description: @@ -254,10 +254,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" + sha256: caa6bc229eab3e32eb2f37b53a5f9d22a6981474afd210c512a7546c1e1a04f6 url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.2.0" fixnum: dependency: transitive description: @@ -307,10 +307,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: c18f1de98fe0bb9dd5ba91e1330d4febc8b6a7de6aae3ffe475ef423723e72f3 + sha256: "55b9b229307a10974b26296ff29f2e132256ba4bd74266939118eaefa941cb00" url: "https://pub.dev" source: hosted - version: "16.3.2" + version: "16.3.3" flutter_local_notifications_linux: dependency: transitive description: @@ -336,10 +336,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: a64c5323ac83ed2b7940d2b6288d160aa1753ff271ba9d9b2a86770414aa3eab + sha256: cb44f7831b23a6bdd0f501718b0d2e8045cbc625a15f668af37ddb80314821db url: "https://pub.dev" source: hosted - version: "0.6.20+1" + version: "0.6.21" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -474,10 +474,10 @@ packages: dependency: transitive description: name: markdown - sha256: "1b134d9f8ff2da15cb298efe6cd8b7d2a78958c1b00384ebcbdf13fe340a6c90" + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.dev" source: hosted - version: "7.2.1" + version: "7.2.2" matcher: dependency: transitive description: @@ -943,10 +943,10 @@ packages: dependency: transitive description: name: web - sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad" + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.5.1" webview_flutter: dependency: "direct main" description: @@ -983,10 +983,10 @@ packages: dependency: transitive description: name: win32 - sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" url: "https://pub.dev" source: hosted - version: "5.2.0" + version: "5.3.0" win32_registry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 62e9067..1a44b56 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.4+2254 # When changing this, update the tag in main() accordingly +version: 1.0.5+2255 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From 2e90d1fb1818848ce2d5bff22b284f7063861946 Mon Sep 17 00:00:00 2001 From: dik08razz Date: Sat, 9 Mar 2024 22:37:27 +0200 Subject: [PATCH 38/58] Update uk.json --- assets/translations/uk.json | 132 ++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/assets/translations/uk.json b/assets/translations/uk.json index fd3365b..7a04629 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -28,13 +28,13 @@ "xIsTrackOnly": "{} - тільки відстежування", "source": "Джерело", "app": "застосунок", - "appsFromSourceAreTrackOnly": "Додатки з цього джерела є лише для відстежування.", + "appsFromSourceAreTrackOnly": "Застосунки з цього джерела є лише для відстежування.", "youPickedTrackOnly": "Ви вибрали опцію лише для відстежування.", "trackOnlyAppDescription": "Застосунок буде відстежуватися для оновлень, але Obtainium не зможе його завантажити або встановити.", "cancelled": "Скасовано", "appAlreadyAdded": "Застосунок вже додано", "alreadyUpToDateQuestion": "Застосунок вже оновлено?", - "addApp": "Додати Застосунок", + "addApp": "Додати", "appSourceURL": "URL-адреса джерела застосунку", "error": "Помилка", "add": "Додати", @@ -44,9 +44,9 @@ "supportedSources": "Підтримувані джерела", "trackOnlyInBrackets": "(Тільки для відстеження)", "searchableInBrackets": "(Можливий пошук)", - "appsString": "Додатки", - "noApps": "Додатків немає", - "noAppsForFilter": "Додатків для фільтрації немає", + "appsString": "Застосунки", + "noApps": "Застосунків немає", + "noAppsForFilter": "Застосунків для фільтрації немає", "byX": "За {}", "percentProgress": "Прогрес: {}%", "pleaseWait": "Будь ласка, зачекайте", @@ -56,35 +56,35 @@ "selectAll": "Вибрати все", "deselectX": "Скасувати вибір {}", "xWillBeRemovedButRemainInstalled": "{} буде видалено з Obtainium, але залишиться встановленим на пристрої.", - "removeSelectedAppsQuestion": "Видалити вибрані додатки?", - "removeSelectedApps": "Видалити вибрані додатки", + "removeSelectedAppsQuestion": "Видалити вибрані застосунки?", + "removeSelectedApps": "Видалити вибрані застосунки", "updateX": "Оновити {}", "installX": "Встановити {}", "markXTrackOnlyAsUpdated": "Позначити {}\n(Тільки відстежування)\nяк оновлено", "changeX": "Змінити {}", - "installUpdateApps": "Встановити/Оновити додатки", - "installUpdateSelectedApps": "Встановити/Оновити вибрані додатки", - "markXSelectedAppsAsUpdated": "Позначити {} вибрані додатки як оновлені?", + "installUpdateApps": "Встановити/Оновити застосунки", + "installUpdateSelectedApps": "Встановити/Оновити вибрані застосунки", + "markXSelectedAppsAsUpdated": "Позначити {} вибрані застосунки як оновлені?", "no": "Ні", "yes": "Так", - "markSelectedAppsUpdated": "Позначити вибрані додатки як оновлені", + "markSelectedAppsUpdated": "Позначити вибрані застосунки як оновлені", "pinToTop": "Закріпити угорі", "unpinFromTop": "Відкріпити зверху", - "resetInstallStatusForSelectedAppsQuestion": "Скинути статус встановлення для вибраних додатків?", - "installStatusOfXWillBeResetExplanation": "Статус встановлення будь-яких вибраних додатків буде скинутий.\n\nЦе може допомогти, коли версія застосунку, відображена в Obtainium, є неправильною через невдалі оновлення або інші проблеми.", + "resetInstallStatusForSelectedAppsQuestion": "Скинути статус встановлення для вибраних застосунків?", + "installStatusOfXWillBeResetExplanation": "Статус встановлення будь-яких вибраних застосунків буде скинутий.\n\nЦе може допомогти, коли версія застосунку, відображена в Obtainium, є неправильною через невдалі оновлення або інші проблеми.", "customLinkMessage": "Ці посилання працюють на пристроях з встановленим Obtainium", "shareAppConfigLinks": "Поділитися посиланнями на конфігурацію Застосунку як HTML", - "shareSelectedAppURLs": "Поділитися вибраними URL-адресами додатків", + "shareSelectedAppURLs": "Поділитися вибраними URL-адресами застосунків", "resetInstallStatus": "Скинути статус встановлення", "more": "Більше", - "removeOutdatedFilter": "Видалити фільтр застарілих додатків", - "showOutdatedOnly": "Показати лише застарілі додатки", + "removeOutdatedFilter": "Видалити фільтр застарілих застосунків", + "showOutdatedOnly": "Показати лише застарілі застосунки", "filter": "Фільтр", - "filterApps": "Фільтрувати додатки", + "filterApps": "Фільтрувати застосунки", "appName": "Назва застосунку", "author": "Автор", - "upToDateApps": "Актуальні додатки", - "nonInstalledApps": "Невстановлені додатки", + "upToDateApps": "Актуальні застосунки", + "nonInstalledApps": "Невстановлені застосунки", "importExport": "Імпорт/Експорт", "settings": "Налаштування", "exportedTo": "Експортовано в {}", @@ -94,14 +94,14 @@ "obtainiumImport": "Імпорт в Obtainium", "importFromURLList": "Імпорт зі списку URL-адрес", "searchQuery": "Пошуковий запит", - "appURLList": "Список URL-адрес додатків", + "appURLList": "Список URL-адрес застосунків", "line": "Лінія", "searchX": "Пошук {}", "noResults": "Результати відсутні", "importX": "Імпорт {}", - "importedAppsIdDisclaimer": "Імпортовані додатки можуть неправильно відображатися як \"Не встановлені\".\nДля виправлення цього перевстановіть їх через Obtainium.\nЦе не повинно вплинути на дані додатків.\n\nПов'язано лише з URL-адресами та імпортом від третіх сторін.", + "importedAppsIdDisclaimer": "Імпортовані застосунки можуть неправильно відображатися як \"Не встановлені\".\nДля виправлення цього перевстановіть їх через Obtainium.\nЦе не повинно вплинути на дані застосунків.\n\nПов'язано лише з URL-адресами та імпортом від третіх сторін.", "importErrors": "Помилки імпорту", - "importedXOfYApps": "Імпортовано {} з {} додатків.", + "importedXOfYApps": "Імпортовано {} з {} застосунків.", "followingURLsHadErrors": "Помилки в наступних URL-адресах:", "selectURL": "Вибрати URL", "selectURLs": "Вибрати URL-адреси", @@ -110,19 +110,19 @@ "dark": "Темна", "light": "Світла", "followSystem": "Дотримуватися системи", - "useBlackTheme": "Використовувати чисто чорну темну тему", - "appSortBy": "Сортувати додатки за", + "useBlackTheme": "Використовувати чорну тему (Amoled)", + "appSortBy": "Сортувати застосунки за", "authorName": "Автор/Назва", "nameAuthor": "Назва/Автор", "asAdded": "За додаванням", - "appSortOrder": "Порядок сортування додатків", + "appSortOrder": "Порядок сортування застосунків", "ascending": "За зростанням", "descending": "За спаданням", "bgUpdateCheckInterval": "Інтервал перевірки оновлень у фоновому режимі", "neverManualOnly": "Ніколи - Тільки вручну", "appearance": "Вигляд", "showWebInAppView": "Показати джерело застосунку у вигляді веб-сторінки", - "pinUpdates": "Закріпити оновлення у верхній частині вигляду додатків", + "pinUpdates": "Закріпити оновлення у верхній частині вигляду застосунків", "updates": "Оновлення", "sourceSpecific": "Певне джерело", "appSource": "Джерело застосунку", @@ -139,23 +139,23 @@ "warning": "Попередження", "sourceIsXButPackageFromYPrompt": "Джерело застосунку - '{}' але пакет випуску походить з '{}'. Продовжити?", "updatesAvailable": "Доступні оновлення", - "updatesAvailableNotifDescription": "Повідомляє користувача, що доступні оновлення для одного чи декількох додатків, які відстежує Obtainium", + "updatesAvailableNotifDescription": "Повідомляє користувача, що доступні оновлення для одного чи декількох застосунків, які відстежує Obtainium", "noNewUpdates": "Немає нових оновлень.", "xHasAnUpdate": "{} має оновлення.", - "appsUpdated": "Додатки оновлено", - "appsUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного чи декількох додатків було застосовано в фоновому режимі", + "appsUpdated": "Застосунки оновлено", + "appsUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного чи декількох застосунків було застосовано в фоновому режимі", "xWasUpdatedToY": "{} було оновлено до {}.", "errorCheckingUpdates": "Помилка перевірки оновлень", "errorCheckingUpdatesNotifDescription": "Повідомлення, яке з'являється, коли перевірка оновлень в фоновому режимі завершується невдачею", - "appsRemoved": "Додатки видалено", - "appsRemovedNotifDescription": "Повідомляє користувача, що один чи декілька додатків були видалені через помилки при завантаженні", + "appsRemoved": "Застосунки видалено", + "appsRemovedNotifDescription": "Повідомляє користувача, що один чи декілька застосунків були видалені через помилки при завантаженні", "xWasRemovedDueToErrorY": "{} було видалено через цю помилку: {}", "completeAppInstallation": "Завершення установки застосунку", - "obtainiumMustBeOpenToInstallApps": "Для встановлення додатків Obtainium має бути відкритий", + "obtainiumMustBeOpenToInstallApps": "Для встановлення застосунків Obtainium має бути відкритий", "completeAppInstallationNotifDescription": "Прохання користувача повернутися до Obtainium для завершення установки застосунку", "checkingForUpdates": "Перевірка оновлень", "checkingForUpdatesNotifDescription": "Тимчасове повідомлення, яке з'являється при перевірці оновлень", - "pleaseAllowInstallPerm": "Будь ласка, дозвольте Obtainium встановлювати додатки", + "pleaseAllowInstallPerm": "Будь ласка, дозвольте Obtainium встановлювати застосунки", "trackOnly": "Тільки відстеження", "errorWithHttpStatusCode": "Помилка {} HTTP-коду", "versionCorrectionDisabled": "Виправлення версії вимкнено (здається, плагін не працює)", @@ -171,7 +171,7 @@ "appIdOrName": "Ідентифікатор або назва застосунку", "appId": "Ідентифікатор застосунку", "appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено", - "reposHaveMultipleApps": "Сховища можуть містити кілька додатків", + "reposHaveMultipleApps": "Сховища можуть містити кілька застосунків", "fdroidThirdPartyRepo": "F-Droid Стороннє сховище", "steamMobile": "Мобільний Steam", "steamChat": "Чат Steam", @@ -181,7 +181,7 @@ "markUpdated": "Позначити як оновлене", "additionalOptions": "Додаткові опції", "disableVersionDetection": "Вимкнути визначення версії", - "noVersionDetectionExplanation": "Цю опцію слід використовувати лише для додатків, де визначення версії працює неправильно.", + "noVersionDetectionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно.", "downloadingX": "Завантаження {}", "downloadNotifDescription": "Повідомляє користувача про прогрес завантаження застосунку", "noAPKFound": "APK не знайдено", @@ -192,19 +192,19 @@ "noCategory": "Без категорії", "noCategories": "Немає категорій", "deleteCategoriesQuestion": "Видалити категорії?", - "categoryDeleteWarning": "Усі додатки у видалених категоріях будуть переведені у некатегоризовані.", + "categoryDeleteWarning": "Усі застосунки у видалених категоріях будуть переведені у некатегоризовані.", "addCategory": "Додати категорію", "label": "Мітка", "language": "Мова", "copiedToClipboard": "Скопійовано в буфер обміну", "storagePermissionDenied": "Відмовлено у дозволі на доступ до сховища", - "selectedCategorizeWarning": "Це замінить будь-які існуючі налаштування категорій для вибраних додатків.", + "selectedCategorizeWarning": "Це замінить будь-які існуючі налаштування категорій для вибраних застосунків.", "filterAPKsByRegEx": "Фільтрувати APK за регулярним виразом", "removeFromObtainium": "Видалити з Obtainium", "uninstallFromDevice": "Видалити з пристрою", "onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.", "releaseDateAsVersion": "Використовувати дату випуску як рядок версії", - "releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для додатків, де визначення версії працює неправильно, але є дата випуску.", + "releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.", "changes": "Зміни", "releaseDate": "Дата випуску", "importFromURLsInFile": "Імпорт з URL-адрес у файлі (наприклад, OPML)", @@ -217,13 +217,13 @@ "dontShowAgain": "Не показувати це знову", "dontShowTrackOnlyWarnings": "Не показувати попередження про 'Тільки відстеження'", "dontShowAPKOriginWarnings": "Не показувати попередження про походження APK", - "moveNonInstalledAppsToBottom": "Перемістити невстановлені додатки вниз у перегляді додатків", + "moveNonInstalledAppsToBottom": "Перемістити невстановлені застосунки вниз у перегляді застосунків", "gitlabPATLabel": "Особистий токен GitLab (Увімкнення пошуку та краще виявлення APK)", "about": "Про програму", "requiresCredentialsInSettings": "{} потребує додаткових облікових даних (у налаштуваннях)", "checkOnStart": "Перевірити наявність оновлень при запуску", "tryInferAppIdFromCode": "Спробувати вивести ідентифікатор застосунку з вихідного коду", - "removeOnExternalUninstall": "Автоматично видаляти додатки, які було видалено зовнішнім чином", + "removeOnExternalUninstall": "Автоматично видаляти застосунки, які було видалено зовнішнім чином", "pickHighestVersionCode": "Автоматично вибрати APK з найвищим кодом версії", "checkUpdateOnDetailPage": "Перевіряти наявність оновлень при відкритті сторінки деталей застосунку", "disablePageTransitions": "Вимкнути анімації переходів між сторінками", @@ -236,11 +236,11 @@ "sortByLastLinkSegment": "Сортувати лише за останнім сегментом посилання", "filterReleaseNotesByRegEx": "Фільтрувати примітки до релізу за регулярним виразом", "customLinkFilterRegex": "Фільтр кастомного посилання на APK за регулярним виразом (за замовчуванням '.apk$')", - "appsPossiblyUpdated": "Оновлення додатків спробовано", - "appsPossiblyUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного або декількох додатків можливо були застосовані в фоновому режимі", + "appsPossiblyUpdated": "Спроб оновлення застосунків", + "appsPossiblyUpdatedNotifDescription": "Повідомляє користувача, що оновлення одного або декількох застосунків можливо були застосовані в фоновому режимі", "xWasPossiblyUpdatedToY": "{} можливо було оновлено до {}.", "enableBackgroundUpdates": "Увімкнути оновлення в фоновому режимі", - "backgroundUpdateReqsExplanation": "Оновлення в фоновому режимі може бути неможливим для всіх додатків.", + "backgroundUpdateReqsExplanation": "Оновлення в фоновому режимі може бути неможливим для всіх застосунків.", "backgroundUpdateLimitsExplanation": "Успіх фонової установки може бути визначений лише після відкриття Obtainium.", "verifyLatestTag": "Перевірити тег 'latest'", "intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування", @@ -269,14 +269,14 @@ "installing": "Встановлення", "skipUpdateNotifications": "Пропустити сповіщення про оновлення", "updatesAvailableNotifChannel": "Доступні оновлення", - "appsUpdatedNotifChannel": "Додатки оновлені", - "appsPossiblyUpdatedNotifChannel": "Спроба оновлення додатків", + "appsUpdatedNotifChannel": "Застосунки оновлені", + "appsPossiblyUpdatedNotifChannel": "Спроба оновлення застосунків", "errorCheckingUpdatesNotifChannel": "Помилка перевірки оновлень", - "appsRemovedNotifChannel": "Додатки видалені", + "appsRemovedNotifChannel": "Застосунки видалені", "downloadingXNotifChannel": "Завантаження {}", "completeAppInstallationNotifChannel": "Завершення встановлення застосунку", "checkingForUpdatesNotifChannel": "Перевірка оновлень", - "onlyCheckInstalledOrTrackOnlyApps": "Перевіряти лише встановлені та додатки, які відстежуються для оновлень", + "onlyCheckInstalledOrTrackOnlyApps": "Перевіряти лише встановлені та застосунки, які відстежуються для оновлень", "supportFixedAPKURL": "Підтримка фіксованих посилань на APK", "selectX": "Вибрати {}", "parallelDownloads": "Дозволити паралельні завантаження", @@ -301,8 +301,8 @@ "selfHostedNote": "Випадаючий список \"{}\" може використовуватися для доступу до власних/призначених для самостійного використання екземплярів будь-якого джерела.", "badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)", "removeAppQuestion": { - "one": "Видалити Застосунок?", - "other": "Видалити додатки?" + "one": "Видалити застосунок?", + "other": "Видалити застосунки?" }, "tooManyRequestsTryAgainInMinutes": { "one": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилину", @@ -313,44 +313,44 @@ "other": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилин" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "Фонова перевірка оновлень знайшла {} оновлення - сповістить користувача, якщо це необхідно", - "other": "Фонова перевірка оновлень знайшла {} оновлень - сповістить користувача, якщо це необхідно" + "one": "Фонова перевірка оновлень знайшла {} оновлення - сповістити користувача, якщо це необхідно", + "other": "Фонова перевірка оновлень знайшла {} оновлень - сповістити користувача, якщо це необхідно" }, "apps": { - "one": "{} Застосунок", - "other": "{} Додатки" + "one": "{} застосунок", + "other": "{} застосунки" }, "url": { - "one": "{} URL", + "one": "{} URL-адреса", "other": "{} URL-адреси" }, "minute": { - "one": "{} Хвилина", - "other": "{} Хвилин" + "one": "{} хвилина", + "other": "{} хвилин" }, "hour": { - "one": "{} Година", - "other": "{} Годин" + "one": "{} година", + "other": "{} годин" }, "day": { - "one": "{} День", - "other": "{} Днів" + "one": "{} день", + "other": "{} днів" }, "clearedNLogsBeforeXAfterY": { "one": "Очищено {n} журнал (до = {before}, після = {after})", "other": "Очищено {n} журналів (до = {before}, після = {after})" }, "xAndNMoreUpdatesAvailable": { - "one": "{} і 1 інше Застосунок мають оновлення.", - "other": "{} і {} інших додатки мають оновлення." + "one": "{} та ще 1 застосунок мають оновлення.", + "other": "{} та ще {} застосунки мають оновлення." }, "xAndNMoreUpdatesInstalled": { - "one": "{} і 1 інше Застосунок було оновлено.", - "other": "{} і {} інших додатків було оновлено." + "one": "{} та ще 1 застосунок було оновлено.", + "other": "{} та ще {} застосунків було оновлено." }, "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} і 1 інше Застосунок можливо було оновлено.", - "other": "{} і {} інших додатків можливо було оновлено." + "one": "{} та ще 1 застосунок можливо було оновлено.", + "other": "{} та ще {} застосунків можливо було оновлено." }, "apk": { "one": "{} APK", From 558d23b8c0849e07efd0035528b2dd83af8c115e Mon Sep 17 00:00:00 2001 From: dik08razz Date: Sat, 9 Mar 2024 23:28:12 +0200 Subject: [PATCH 39/58] Update uk.json --- assets/translations/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/uk.json b/assets/translations/uk.json index 7a04629..c971034 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -47,7 +47,7 @@ "appsString": "Застосунки", "noApps": "Застосунків немає", "noAppsForFilter": "Застосунків для фільтрації немає", - "byX": "За {}", + "byX": "Від {}", "percentProgress": "Прогрес: {}%", "pleaseWait": "Будь ласка, зачекайте", "updateAvailable": "Доступно оновлення", From 3943caeedb4eb2ad02fe00712b95b644fde2d77f Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 03:04:05 -0400 Subject: [PATCH 40/58] Resume failed downloads when possible (#634) --- lib/providers/apps_provider.dart | 134 +++++++++++++++++++++++-------- 1 file changed, 102 insertions(+), 32 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 4b1d0e6..cff5b0b 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -202,14 +202,18 @@ Future checkPartialDownloadHash(String url, int bytesToGrab, Future downloadFile( String url, String fileNameNoExt, Function? onProgress, String destDir, {bool useExisting = true, Map? headers}) async { + // Send the initial request but cancel it as soon as you have the headers + var reqHeaders = headers ?? {}; var req = Request('GET', Uri.parse(url)); - if (headers != null) { - req.headers.addAll(headers); - } + req.headers.addAll(reqHeaders); var client = http.Client(); StreamedResponse response = await client.send(req); - String ext = - response.headers['content-disposition']?.split('.').last ?? 'apk'; + var resHeaders = response.headers; + + // Use the headers to decide what the file extension is, and + // whether it supports partial downloads (range request), and + // what the total size of the file is (if provided) + String ext = resHeaders['content-disposition']?.split('.').last ?? 'apk'; if (ext.endsWith('"') || ext.endsWith("other")) { ext = ext.substring(0, ext.length - 1); } @@ -217,41 +221,107 @@ Future downloadFile( ext = 'apk'; } File downloadedFile = File('$destDir/$fileNameNoExt.$ext'); - if (!(downloadedFile.existsSync() && useExisting)) { - File tempDownloadedFile = File('${downloadedFile.path}.part'); - if (tempDownloadedFile.existsSync()) { - tempDownloadedFile.deleteSync(recursive: true); - } - var length = response.contentLength; - var received = 0; - double? progress; - var sink = tempDownloadedFile.openWrite(); - await response.stream.map((s) { - received += s.length; - progress = (length != null ? received / length * 100 : 30); - if (onProgress != null) { - onProgress(progress); + + bool rangeFeatureEnabled = false; + if (resHeaders['accept-ranges']?.isNotEmpty == true) { + rangeFeatureEnabled = + resHeaders['accept-ranges']?.trim().toLowerCase() == 'bytes'; + } + + // If you have an existing file that is usable, + // decide whether you can use it (either return full or resume partial) + var fullContentLength = response.contentLength; + if (useExisting && downloadedFile.existsSync()) { + var length = downloadedFile.lengthSync(); + if (fullContentLength == null) { + // Assume full + client.close(); + return downloadedFile; + } else { + // Check if resume needed/possible + if (length == fullContentLength) { + client.close(); + return downloadedFile; } - return s; - }).pipe(sink); - await sink.close(); - progress = null; + if (length > fullContentLength) { + useExisting = false; + } + } + } + + // Download to a '.temp' file (to distinguish btn. complete/incomplete files) + File tempDownloadedFile = File('${downloadedFile.path}.part'); + + // If the range feature is not available (or you need to start a ranged req from 0), + // complete the already-started request, else cancel it and start a ranged request, + // and open the file for writing in the appropriate mode + var targetFileLength = useExisting && tempDownloadedFile.existsSync() + ? tempDownloadedFile.lengthSync() + : null; + int rangeStart = targetFileLength ?? 0; + IOSink? sink; + if (rangeFeatureEnabled && fullContentLength != null && rangeStart > 0) { + client.close(); + client = http.Client(); + req = Request('GET', Uri.parse(url)); + req.headers.addAll(reqHeaders); + req.headers.addAll({'range': 'bytes=$rangeStart-${fullContentLength - 1}'}); + response = await client.send(req); + sink = tempDownloadedFile.openWrite(mode: FileMode.writeOnlyAppend); + } else if (tempDownloadedFile.existsSync()) { + tempDownloadedFile.deleteSync(recursive: true); + } + sink ??= tempDownloadedFile.openWrite(mode: FileMode.writeOnly); + + // Perform the download + var received = 0; + double? progress; + if (rangeStart > 0 && fullContentLength != null) { + received = rangeStart; + } + await response.stream.map((s) { + received += s.length; + progress = + (fullContentLength != null ? (received / fullContentLength) * 100 : 30); if (onProgress != null) { onProgress(progress); } - if (response.statusCode != 200) { - tempDownloadedFile.deleteSync(recursive: true); - throw response.reasonPhrase ?? tr('unexpectedError'); - } - if (tempDownloadedFile.existsSync()) { - tempDownloadedFile.renameSync(downloadedFile.path); - } - } else { - client.close(); + return s; + }).pipe(sink); + await sink.close(); + progress = null; + if (onProgress != null) { + onProgress(progress); } + if (response.statusCode < 200 || response.statusCode > 299) { + tempDownloadedFile.deleteSync(recursive: true); + throw response.reasonPhrase ?? tr('unexpectedError'); + } + print(tempDownloadedFile.lengthSync()); + print(fullContentLength); + if (tempDownloadedFile.existsSync()) { + tempDownloadedFile.renameSync(downloadedFile.path); + } + client.close(); return downloadedFile; } +Future> getHeaders(String url, + {Map? headers}) async { + var req = http.Request('GET', Uri.parse(url)); + if (headers != null) { + req.headers.addAll(headers); + } + var client = http.Client(); + var response = await client.send(req); + if (response.statusCode < 200 || response.statusCode > 299) { + throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError')); + } + var returnHeaders = response.headers; + client.close(); + return returnHeaders; +} + Future getInstalledInfo(String? packageName, {bool printErr = true}) async { if (packageName != null) { From e95f57553003d5ac53b5ca70739f6f8b671b1f0a Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 04:01:09 -0400 Subject: [PATCH 41/58] Typo: 'Installed' not 'Updated' (#1469) + Bugfix: Don't incorrectly show message when user cancels --- lib/pages/app.dart | 5 ++++- lib/providers/apps_provider.dart | 14 +++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/pages/app.dart b/lib/pages/app.dart index cbccc9c..f4f20fc 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -361,6 +361,9 @@ class _AppPageState extends State { !areDownloadsRunning ? () async { try { + var successMessage = app?.app.installedVersion == null + ? tr('installed') + : tr('appsUpdated'); HapticFeedback.heavyImpact(); var res = await appsProvider.downloadAndInstallLatestApps( app?.app.id != null ? [app!.app.id] : [], @@ -368,7 +371,7 @@ class _AppPageState extends State { ); if (res.isNotEmpty && !trackOnly) { // ignore: use_build_context_synchronously - showMessage(tr('appsUpdated'), context); + showMessage(successMessage, context); } if (res.isNotEmpty && mounted) { Navigator.of(context).pop(); diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index cff5b0b..e152163 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -563,13 +563,13 @@ class AppsProvider with ChangeNotifier { zipFile: File(filePath), destinationDir: Directory(destinationPath)); } - Future installXApkDir(DownloadedXApkDir dir, + Future installXApkDir(DownloadedXApkDir dir, {bool needsBGWorkaround = false}) async { // We don't know which APKs in an XAPK are supported by the user's device // So we try installing all of them and assume success if at least one installed // If 0 APKs installed, throw the first install error encountered + var somethingInstalled = false; try { - var somethingInstalled = false; MultiAppMultiError errors = MultiAppMultiError(); for (var file in dir.extracted .listSync(recursive: true, followLinks: false) @@ -596,6 +596,7 @@ class AppsProvider with ChangeNotifier { } finally { dir.extracted.delete(recursive: true); } + return somethingInstalled; } Future installApk(DownloadedApk file, @@ -828,17 +829,18 @@ class AppsProvider with ChangeNotifier { notifyListeners(); try { if (!skipInstalls) { + bool sayInstalled = true; if (downloadedFile != null) { if (willBeSilent && context == null) { installApk(downloadedFile, needsBGWorkaround: true); } else { - await installApk(downloadedFile); + sayInstalled = await installApk(downloadedFile); } } else { if (willBeSilent && context == null) { installXApkDir(downloadedDir!, needsBGWorkaround: true); } else { - await installXApkDir(downloadedDir!); + sayInstalled = await installXApkDir(downloadedDir!); } } if (willBeSilent && context == null) { @@ -846,7 +848,9 @@ class AppsProvider with ChangeNotifier { [apps[id]!.app], id: id.hashCode)); } - installedIds.add(id); + if (sayInstalled) { + installedIds.add(id); + } } } finally { apps[id]?.downloadProgress = null; From 4e968826ba9f24cf96f97029f1aa7a451cc34e21 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 04:15:43 -0400 Subject: [PATCH 42/58] Add changelog button to app page (#1474) --- lib/pages/app.dart | 29 ++++++-- lib/pages/apps.dart | 177 ++++++++++++++++++++++---------------------- 2 files changed, 109 insertions(+), 97 deletions(-) diff --git a/lib/pages/app.dart b/lib/pages/app.dart index f4f20fc..6970cb3 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import 'package:obtainium/components/generated_form_modal.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/main.dart'; +import 'package:obtainium/pages/apps.dart'; import 'package:obtainium/pages/settings.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; @@ -108,6 +109,7 @@ class _AppPageState extends State { infoLines = '$infoLines\n${app?.app.apkUrls.length == 1 ? app?.app.apkUrls[0].key : plural('apk', app?.app.apkUrls.length ?? 0)}'; } + var changeLogFn = app != null ? getChangeLogFn(context, app.app) : null; return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.stretch, @@ -125,13 +127,26 @@ class _AppPageState extends State { .textTheme .bodyLarge! .copyWith(fontWeight: FontWeight.bold)), - app?.app.releaseDate == null - ? const SizedBox.shrink() - : Text( - app!.app.releaseDate.toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.labelSmall, - ), + changeLogFn != null || app?.app.releaseDate != null + ? GestureDetector( + onTap: changeLogFn, + child: Text( + app?.app.releaseDate == null + ? tr('changes') + : app!.app.releaseDate.toString(), + textAlign: TextAlign.center, + style: + Theme.of(context).textTheme.labelSmall!.copyWith( + decoration: changeLogFn != null + ? TextDecoration.underline + : null, + fontStyle: changeLogFn != null + ? FontStyle.italic + : null, + ), + ), + ) + : const SizedBox.shrink(), const SizedBox( height: 8, ), diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 0a94dd6..52125ed 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -26,6 +26,92 @@ class AppsPage extends StatefulWidget { State createState() => AppsPageState(); } +showChangeLogDialog(BuildContext context, App app, String? changesUrl, + AppSource appSource, String changeLog) { + showDialog( + context: context, + builder: (BuildContext context) { + return GeneratedFormModal( + title: tr('changes'), + items: const [], + message: app.latestVersion, + additionalWidgets: [ + changesUrl != null + ? GestureDetector( + child: Text( + changesUrl, + style: const TextStyle( + decoration: TextDecoration.underline, + fontStyle: FontStyle.italic), + ), + onTap: () { + launchUrlString(changesUrl, + mode: LaunchMode.externalApplication); + }, + ) + : const SizedBox.shrink(), + changesUrl != null + ? const SizedBox( + height: 16, + ) + : const SizedBox.shrink(), + appSource.changeLogIfAnyIsMarkDown + ? SizedBox( + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height - 350, + child: Markdown( + data: changeLog, + onTapLink: (text, href, title) { + if (href != null) { + launchUrlString( + href.startsWith('http://') || + href.startsWith('https://') + ? href + : '${Uri.parse(app.url).origin}/$href', + mode: LaunchMode.externalApplication); + } + }, + extensionSet: md.ExtensionSet( + md.ExtensionSet.gitHubFlavored.blockSyntaxes, + [ + md.EmojiSyntax(), + ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes + ], + ), + )) + : Text(changeLog), + ], + singleNullReturnButton: tr('ok'), + ); + }); +} + +getChangeLogFn(BuildContext context, App app) { + AppSource appSource = + SourceProvider().getSource(app.url, overrideSource: app.overrideSource); + String? changesUrl = appSource.changeLogPageFromStandardUrl(app.url); + String? changeLog = app.changeLog; + if (changeLog?.split('\n').length == 1) { + if (RegExp( + '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?') + .hasMatch(changeLog!)) { + if (changesUrl == null) { + changesUrl = changeLog; + changeLog = null; + } + } + } + return (changeLog == null && changesUrl == null) + ? null + : () { + if (changeLog != null) { + showChangeLogDialog(context, app, changesUrl, appSource, changeLog); + } else { + launchUrlString(changesUrl!, mode: LaunchMode.externalApplication); + } + }; +} + class AppsPageState extends State { AppsFilter filter = AppsFilter(); final AppsFilter neutralFilter = AppsFilter(); @@ -262,66 +348,6 @@ class AppsPageState extends State { .where((a) => selectedAppIds.contains(a.id)) .toSet(); - showChangeLogDialog( - String? changesUrl, AppSource appSource, String changeLog, int index) { - showDialog( - context: context, - builder: (BuildContext context) { - return GeneratedFormModal( - title: tr('changes'), - items: const [], - message: listedApps[index].app.latestVersion, - additionalWidgets: [ - changesUrl != null - ? GestureDetector( - child: Text( - changesUrl, - style: const TextStyle( - decoration: TextDecoration.underline, - fontStyle: FontStyle.italic), - ), - onTap: () { - launchUrlString(changesUrl, - mode: LaunchMode.externalApplication); - }, - ) - : const SizedBox.shrink(), - changesUrl != null - ? const SizedBox( - height: 16, - ) - : const SizedBox.shrink(), - appSource.changeLogIfAnyIsMarkDown - ? SizedBox( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height - 350, - child: Markdown( - data: changeLog, - onTapLink: (text, href, title) { - if (href != null) { - launchUrlString( - href.startsWith('http://') || - href.startsWith('https://') - ? href - : '${Uri.parse(listedApps[index].app.url).origin}/$href', - mode: LaunchMode.externalApplication); - } - }, - extensionSet: md.ExtensionSet( - md.ExtensionSet.gitHubFlavored.blockSyntaxes, - [ - md.EmojiSyntax(), - ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes - ], - ), - )) - : Text(changeLog), - ], - singleNullReturnButton: tr('ok'), - ); - }); - } - getLoadingWidgets() { return [ if (listedApps.isEmpty) @@ -351,35 +377,6 @@ class AppsPageState extends State { ]; } - getChangeLogFn(int appIndex) { - AppSource appSource = SourceProvider().getSource( - listedApps[appIndex].app.url, - overrideSource: listedApps[appIndex].app.overrideSource); - String? changesUrl = - appSource.changeLogPageFromStandardUrl(listedApps[appIndex].app.url); - String? changeLog = listedApps[appIndex].app.changeLog; - if (changeLog?.split('\n').length == 1) { - if (RegExp( - '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?') - .hasMatch(changeLog!)) { - if (changesUrl == null) { - changesUrl = changeLog; - changeLog = null; - } - } - } - return (changeLog == null && changesUrl == null) - ? null - : () { - if (changeLog != null) { - showChangeLogDialog(changesUrl, appSource, changeLog, appIndex); - } else { - launchUrlString(changesUrl!, - mode: LaunchMode.externalApplication); - } - }; - } - getUpdateButton(int appIndex) { return IconButton( visualDensity: VisualDensity.compact, @@ -444,7 +441,7 @@ class AppsPageState extends State { } getSingleAppHorizTile(int index) { - var showChangesFn = getChangeLogFn(index); + var showChangesFn = getChangeLogFn(context, listedApps[index].app); var hasUpdate = listedApps[index].app.installedVersion != null && listedApps[index].app.installedVersion != listedApps[index].app.latestVersion; From 0db27c773b51c3ef2505e897df46e2e4ee08e951 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 04:52:17 -0400 Subject: [PATCH 43/58] Upgrade packages, increment version --- pubspec.lock | 20 ++++++++++---------- pubspec.yaml | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index fa08f4a..a3b488c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -38,10 +38,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: "3ced568a5d9e309e99af71285666f1f3117bddd0bd5b3317979dccc1a40cada4" + sha256: fd7fc1569870b4b0d90d17a9f36661a6ff92400fecb6e4adab4abe0f0488bb5f url: "https://pub.dev" source: hosted - version: "3.5.1" + version: "4.0.0" archive: dependency: transitive description: @@ -307,10 +307,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "55b9b229307a10974b26296ff29f2e132256ba4bd74266939118eaefa941cb00" + sha256: f9a05409385b77b06c18f200a41c7c2711ebf7415669350bb0f8474c07bd40d1 url: "https://pub.dev" source: hosted - version: "16.3.3" + version: "17.0.0" flutter_local_notifications_linux: dependency: transitive description: @@ -783,10 +783,10 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" stack_trace: dependency: transitive description: @@ -959,10 +959,10 @@ packages: dependency: transitive description: name: webview_flutter_android - sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0" + sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934 url: "https://pub.dev" source: hosted - version: "3.15.0" + version: "3.16.0" webview_flutter_platform_interface: dependency: transitive description: @@ -975,10 +975,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86" + sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7 url: "https://pub.dev" source: hosted - version: "3.12.0" + version: "3.13.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1a44b56..0d987f6 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.5+2255 # When changing this, update the tag in main() accordingly +version: 1.0.6+2256 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' @@ -38,7 +38,7 @@ dependencies: cupertino_icons: ^1.0.5 path_provider: ^2.0.11 flutter_fgbg: ^0.3.0 # Try removing reliance on this - flutter_local_notifications: ^16.1.0 + flutter_local_notifications: ^17.0.0 provider: ^6.0.3 http: ^1.0.0 webview_flutter: ^4.0.0 @@ -66,7 +66,7 @@ dependencies: connectivity_plus: ^5.0.0 shared_storage: ^0.8.0 crypto: ^3.0.3 - app_links: ^3.5.0 + app_links: ^4.0.0 background_fetch: ^1.2.1 dev_dependencies: From f905aa7dfdc9527a8180edcedc66fed38938a38e Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 05:12:31 -0400 Subject: [PATCH 44/58] Made required changes according to https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply --- android/app/build.gradle | 21 +++++++++------------ android/build.gradle | 19 ------------------- android/settings.gradle | 30 ++++++++++++++++++++++-------- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 249b190..b953de3 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,11 +22,6 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'dev.rikka.tools.refine' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -33,7 +29,8 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion rootProject.ext.compileSdkVersion + namespace "dev.imranr.obtainium" + compileSdk flutter.compileSdkVersion ndkVersion flutter.ndkVersion compileOptions { @@ -54,7 +51,7 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 24 - targetSdkVersion rootProject.ext.targetSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/android/build.gradle b/android/build.gradle index 5d6d8f4..89b0d75 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,22 +1,3 @@ -buildscript { - ext.kotlin_version = '1.8.10' - ext { - compileSdkVersion = 34 // or latest - targetSdkVersion = 34 // or latest - appCompatVersion = "1.4.2" // or latest - } - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "com.android.tools.build:gradle:7.4.2" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "dev.rikka.tools.refine:gradle-plugin:4.3.1" - } -} - allprojects { repositories { google() diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bc..5fd7f48 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.4.2" apply false + id "org.jetbrains.kotlin.android" version "1.8.10" apply false +} + +include ":app" From da496f7c53ae77526b494bcdb67a439240cadd4a Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 17 Mar 2024 05:14:08 -0400 Subject: [PATCH 45/58] GitHub actions: Don't add '-beta' to beta tags (pre-release mark is enough) --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b378687..f35af1a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,7 +42,6 @@ jobs: if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi echo "beta=$BETA" >> $GITHUB_OUTPUT TAG="v$VERSION" - if [ $BETA == true ]; then TAG="$TAG"-beta; fi echo "tag=$TAG" >> $GITHUB_OUTPUT - name: Build APKs From 9e19a293d4bed4241775c768676f394e863fce50 Mon Sep 17 00:00:00 2001 From: Adolfo Jayme-Barrientos Date: Mon, 18 Mar 2024 17:52:08 -0600 Subject: [PATCH 46/58] Fixes to Spanish translation Includes assorted typography and treatment fixes. --- assets/translations/es.json | 134 ++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/assets/translations/es.json b/assets/translations/es.json index 0f512e8..7d08672 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -1,15 +1,15 @@ { - "invalidURLForSource": "URL de la aplicación {} no es válida", + "invalidURLForSource": "El URL de la aplicación {} no es válido", "noReleaseFound": "No se ha podido encontrar una versión válida", "noVersionFound": "No se ha podido determinar la versión", - "urlMatchesNoSource": "La URL no coincide con ninguna fuente conocida", + "urlMatchesNoSource": "El URL no coincide con ninguna fuente conocida", "cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación", - "appIdMismatch": "La ID del paquete descargado no coincide con la ID de la aplicación instalada", + "appIdMismatch": "El id. del paquete descargado no coincide con la ID de la aplicación instalada", "functionNotImplemented": "Esta clase no ha implementado esta función", "placeholder": "Espacio reservado", "someErrors": "Han ocurrido algunos errores", "unexpectedError": "Error inesperado", - "ok": "OK", + "ok": "Aceptar", "and": "y", "githubPATLabel": "Token de acceso personal a GitHub\n(reduce tiempos de espera)", "includePrereleases": "Incluir versiones preliminares", @@ -34,75 +34,75 @@ "cancelled": "Cancelado", "appAlreadyAdded": "Aplicación añadida anteriormente", "alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?", - "addApp": "Añadir Aplicación", + "addApp": "Añadir aplicación", "appSourceURL": "URL de origen de la aplicación", "error": "Error", "add": "Añadir", "searchSomeSourcesLabel": "Buscar (solo algunas fuentes)", "search": "Buscar", - "additionalOptsFor": "Opciones Adicionales para {}", - "supportedSources": "Fuentes Soportadas", + "additionalOptsFor": "Opciones adicionales para {}", + "supportedSources": "Fuentes admitidas", "trackOnlyInBrackets": "(Solo seguimiento)", - "searchableInBrackets": "(soporta búsqueda)", + "searchableInBrackets": "(permite búsqueda)", "appsString": "Aplicaciones", "noApps": "Sin Aplicaciones", "noAppsForFilter": "Sin aplicaciones para filtrar", "byX": "por: {}", - "percentProgress": "Progreso: {}%", - "pleaseWait": "Por favor, espere", - "updateAvailable": "Actualización Disponible", - "notInstalled": "No Instalado", + "percentProgress": "Progreso: {} %", + "pleaseWait": "Espere un momento", + "updateAvailable": "Actualización disponible", + "notInstalled": "No instalado", "pseudoVersion": "pseudoversión", - "selectAll": "Seleccionar Todo", + "selectAll": "Seleccionar todo", "deselectX": "Deseleccionar {}", - "xWillBeRemovedButRemainInstalled": "{} será eliminada de Obtainium pero continuará instalada en el dispositivo.", + "xWillBeRemovedButRemainInstalled": "{} se eliminará de Obtainium pero continuará instalada en el dispositivo.", "removeSelectedAppsQuestion": "¿Eliminar aplicaciones seleccionadas?", - "removeSelectedApps": "Eliminar Aplicaciones Seleccionadas", + "removeSelectedApps": "Eliminar aplicaciones seleccionadas", "updateX": "Actualizar {}", "installX": "Instalar {}", "markXTrackOnlyAsUpdated": "Marcar {}\n(Solo seguimiento)\ncomo actualizada", "changeX": "Cambiar {}", - "installUpdateApps": "Instalar/Actualizar aplicaciones", - "installUpdateSelectedApps": "Instalar/Actualizar aplicaciones seleccionadas", + "installUpdateApps": "Instalar/actualizar aplicaciones", + "installUpdateSelectedApps": "Instalar/actualizar aplicaciones seleccionadas", "markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?", "no": "No", "yes": "Sí", "markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas", - "pinToTop": "Fijar arriba", - "unpinFromTop": "Desfijar de arriba", + "pinToTop": "Anclar al principio", + "unpinFromTop": "Desanclar del principio", "resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?", "installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.", "customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado", "shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML", - "shareSelectedAppURLs": "Compartir URLs de las aplicaciones seleccionadas", + "shareSelectedAppURLs": "Compartir URL de las aplicaciones seleccionadas", "resetInstallStatus": "Restaurar estado de instalación", "more": "Más", - "removeOutdatedFilter": "Elimiar filtro de aplicaciones desactualizado", + "removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado", "showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas", "filter": "Filtrar", - "filterApps": "Filtrar Actualizaciones", + "filterApps": "Filtrar actualizaciones", "appName": "Nombre de la aplicación", "author": "Autor", - "upToDateApps": "Aplicaciones Actualizadas", - "nonInstalledApps": "Aplicaciones No Instaladas", - "importExport": "Importar/Exportar", + "upToDateApps": "Aplicaciones actualizadas", + "nonInstalledApps": "Aplicaciones no instaladas", + "importExport": "Importar/exportar", "settings": "Ajustes", "exportedTo": "Exportado a {}", "obtainiumExport": "Exportar Obtainium", - "invalidInput": "Input incorrecto", + "invalidInput": "Entrada no válida", "importedX": "Importado {}", "obtainiumImport": "Importar Obtainium", - "importFromURLList": "Importar desde lista de URLs", - "searchQuery": "Consulta de Búsqueda", - "appURLList": "Lista de URLs de Aplicaciones", + "importFromURLList": "Importar desde lista de URL", + "searchQuery": "Término de búsqueda", + "appURLList": "Lista de URL de aplicaciones", "line": "Línea", "searchX": "Buscar {}", - "noResults": "Resultados no encontrados", + "noResults": "No se encontró ningún resultado", "importX": "Importar desde {}", - "importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como \"No Instalada\".\nPara solucionarlo, reinstálalas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a las URLs y a los métodos de importación mediante terceros.", + "importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como «No instalada».\nPara solucionarlo, reinstálelas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a los URL y a los métodos de importación mediante terceros.", "importErrors": "Errores de Importación", - "importedXOfYApps": "{} de {} Aplicaciones importadas.", - "followingURLsHadErrors": "Las siguientes URLs han tenido problemas:", + "importedXOfYApps": "{} de {} aplicaciones importadas.", + "followingURLsHadErrors": "Los URL siguientes han tenido problemas:", "selectURL": "Seleccionar URL", "selectURLs": "Seleccionar URLs", "pick": "Escoger", @@ -110,9 +110,9 @@ "dark": "Oscuro", "light": "Claro", "followSystem": "Seguir al sistema", - "useBlackTheme": "Negro puro en tema Oscuro", - "appSortBy": "Ordenar Apps Por", - "authorName": "Autor/Nombre", + "useBlackTheme": "Negro puro en tema oscuro", + "appSortBy": "Ordenar aplicaciones por", + "authorName": "Autor/nombre", "nameAuthor": "Nombre/Autor", "asAdded": "Según se Añadieron", "appSortOrder": "Orden de Clasificación", @@ -122,22 +122,22 @@ "neverManualOnly": "Nunca, solo manual", "appearance": "Apariencia", "showWebInAppView": "Mostrar vista de la web de origen", - "pinUpdates": "Fijar actualizaciones al principio", + "pinUpdates": "Anclar actualizaciones al principio", "updates": "Actualizaciones", - "sourceSpecific": "Fuente Específica", + "sourceSpecific": "Fuente específica", "appSource": "Obtainium en GitHub", - "noLogs": "Sin Logs", - "appLogs": "Logs", + "noLogs": "Ningún registro", + "appLogs": "Registros", "close": "Cerrar", "share": "Compartir", "appNotFound": "Aplicación no encontrada", "obtainiumExportHyphenatedLowercase": "obtainium-exportación", "pickAnAPK": "Seleccione una APK", "appHasMoreThanOnePackage": "{} tiene más de un paquete:", - "deviceSupportsXArch": "Su dispositivo soporta las siguientes arquitecturas de procesador: {}.", - "deviceSupportsFollowingArchs": "Su dispositivo soporta las siguientes arquitecturas de procesador:", + "deviceSupportsXArch": "Su dispositivo admite las siguientes arquitecturas de procesador: {}.", + "deviceSupportsFollowingArchs": "Su dispositivo admite las siguientes arquitecturas de procesador:", "warning": "Aviso", - "sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es '{}' pero el paquete de la actualización viene de '{}'. ¿Desea continuar?", + "sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es «{}» pero el paquete de la actualización viene de «{}». ¿Desea continuar?", "updatesAvailable": "Actualizaciones Disponibles", "updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium", "noNewUpdates": "No hay nuevas actualizaciones.", @@ -145,17 +145,17 @@ "appsUpdated": "Aplicaciones actualizadas", "appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano", "xWasUpdatedToY": "{} ha sido actualizada a {}.", - "errorCheckingUpdates": "Error buscando ectualizaciones", + "errorCheckingUpdates": "Error al buscar actualizaciones", "errorCheckingUpdatesNotifDescription": "Una notificación que muestra cuándo la comprobación de actualizaciones en segundo plano falla", "appsRemoved": "Aplicaciones eliminadas", "appsRemovedNotifDescription": "Notifica al usuario que una o más aplicaciones fueron eliminadas por problemas al cargarlas", "xWasRemovedDueToErrorY": "{} ha sido eliminada por: {}", "completeAppInstallation": "Instalación completa de la aplicación", "obtainiumMustBeOpenToInstallApps": "Obtainium debe estar abierto para instalar aplicaciones", - "completeAppInstallationNotifDescription": "Pide al usuario volver a Obtainium para terminar de instalar una aplicación", + "completeAppInstallationNotifDescription": "Le pide volver a Obtainium para terminar de instalar una aplicación", "checkingForUpdates": "Buscando actualizaciones...", "checkingForUpdatesNotifDescription": "Notificación temporal que aparece al buscar actualizaciones", - "pleaseAllowInstallPerm": "Por favor, permita que Obtainium instale aplicaciones", + "pleaseAllowInstallPerm": "Permita que Obtainium instale aplicaciones", "trackOnly": "Solo para seguimiento", "errorWithHttpStatusCode": "Error {}", "versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)", @@ -173,8 +173,8 @@ "appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre", "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", "fdroidThirdPartyRepo": "Repositorio de tercera parte F-Droid", - "steamMobile": "Móvil de vapor", - "steamChat": "Chat de vapor", + "steamMobile": "Steam para móviles", + "steamChat": "Chat de Steam", "install": "Instalar", "markInstalled": "Marcar como instalada", "update": "Actualizar", @@ -192,14 +192,14 @@ "noCategory": "Sin categoría", "noCategories": "Sin categorías", "deleteCategoriesQuestion": "¿Eliminar categorías?", - "categoryDeleteWarning": "Todas las aplicaciones en las categorías eliminadas serán marcadas como 'Sin categoría'.", + "categoryDeleteWarning": "Todas las aplicaciones en las categorías eliminadas se marcarán como «Sin categoría».", "addCategory": "Añadir categoría", "label": "Nombre", "language": "Idioma", - "copiedToClipboard": "Copiado al portapapeles", + "copiedToClipboard": "Se copió en el portapapeles", "storagePermissionDenied": "Permiso de almacenamiento rechazado", "selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaciones seleccionadas.", - "filterAPKsByRegEx": "Filtrar por APKs", + "filterAPKsByRegEx": "Filtrar por APK", "removeFromObtainium": "Eliminar de Obtainium", "uninstallFromDevice": "Desinstalar del dispositivo", "onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.", @@ -212,8 +212,8 @@ "versionDetection": "Detección de versiones", "standardVersionDetection": "Por versión", "groupByCategory": "Agrupar por categoría", - "autoApkFilterByArch": "Filtrar APKs por arquitectura del procesador (si es posible)", - "overrideSource": "Sobrescribir Fuente", + "autoApkFilterByArch": "Filtrar APK por arquitectura del procesador (si es posible)", + "overrideSource": "Anular fuente", "dontShowAgain": "No mostrar de nuevo", "dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps en 'solo seguimiento'", "dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs", @@ -262,7 +262,7 @@ "takeFirstLink": "Usar primer enlace", "skipSort": "Omitir orden", "debugMenu": "Menu Depurar", - "bgTaskStarted": "Iniciada tarea en segundo plano - revisa los logs.", + "bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.", "runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano", "versionExtractWholePage": "Aplicar la versión de extracción regex a la página entera", "installing": "Instalando", @@ -297,23 +297,23 @@ "latest": "Versión más reciente", "invertRegEx": "Invertir expresión regular", "note": "Nota", - "selfHostedNote": "El desplegable \"{}\" puede utilizarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.", + "selfHostedNote": "El desplegable «{}» puede utilizarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.", "badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)", "removeAppQuestion": { - "one": "¿Eliminar Aplicación?", - "other": "¿Eliminar Aplicaciones?" + "one": "¿Eliminar aplicación?", + "other": "¿Eliminar aplicaciones?" }, "tooManyRequestsTryAgainInMinutes": { - "one": "Muchas peticiones (limitado) - prueba de nuevo en {} minuto", - "other": "Muchas peticiones (limitado) - prueba de nuevo en {} minutos" + "one": "Muchas peticiones (limitado); pruebe de nuevo en {} minuto", + "other": "Muchas peticiones (limitado); pruebe de nuevo en {} minutos" }, "bgUpdateGotErrorRetryInMinutes": { - "one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minuto", - "other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minutos" + "one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minuto", + "other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minutos" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización - se notificará al usuario si es necesario", - "other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones - se notificará al usuario si es necesario" + "one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización; se le notificará si es necesario", + "other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario" }, "apps": { "one": "{} Aplicación", @@ -336,16 +336,16 @@ "other": "{} días" }, "clearedNLogsBeforeXAfterY": { - "one": "Eliminado {n} log (previo a = {before}, posterior a = {after})", - "other": "Eliminados {n} logs (previos a = {before}, posteriores a = {after})" + "one": "Eliminado {n} registro (previo a = {before}, posterior a = {after})", + "other": "Eliminados {n} registros (previos a = {before}, posteriores a = {after})" }, "xAndNMoreUpdatesAvailable": { "one": "{} y 1 aplicación más tiene actualizaciones.", "other": "{} y {} aplicaciones más tienen actualizaciones." }, "xAndNMoreUpdatesInstalled": { - "one": "{} y 1 aplicación más han sido actualizadas.", - "other": "{} y {} aplicaciones más han sido actualizadas." + "one": "{} y 1 aplicación más se han actualizado.", + "other": "{} y {} aplicaciones más se han actualizado." }, "xAndNMoreUpdatesPossiblyInstalled": { "one": "{} y 1 aplicación más podría haber sido actualizada.", From f76aa51b5467df597d67bd7efaf691cfe761db6b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 23 Mar 2024 19:26:39 -0400 Subject: [PATCH 47/58] Delete downloaded APK on install fail (#1495) --- lib/providers/apps_provider.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index e152163..7f4efed 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -297,8 +297,6 @@ Future downloadFile( tempDownloadedFile.deleteSync(recursive: true); throw response.reasonPhrase ?? tr('unexpectedError'); } - print(tempDownloadedFile.lengthSync()); - print(fullContentLength); if (tempDownloadedFile.existsSync()) { tempDownloadedFile.renameSync(downloadedFile.path); } @@ -648,7 +646,13 @@ class AppsProvider with ChangeNotifier { } bool installed = false; if (code != null && code != 0 && code != 3) { - throw InstallError(code); + try { + file.file.deleteSync(recursive: true); + } catch (e) { + // + } finally { + throw InstallError(code); + } } else if (code == 0) { installed = true; apps[file.appId]!.app.installedVersion = From d76b7375cb65a990757750dc3910bbd5443bd2e6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 28 Mar 2024 22:28:55 -0400 Subject: [PATCH 48/58] Added 'Share new Apps with AppVerifier' (#255) --- assets/translations/bs.json | 2 + assets/translations/cs.json | 4 +- assets/translations/de.json | 2 + assets/translations/en.json | 2 + assets/translations/es.json | 2 + assets/translations/fa.json | 2 + assets/translations/fr.json | 2 + assets/translations/hu.json | 4 +- assets/translations/it.json | 4 +- assets/translations/ja.json | 2 + assets/translations/nl.json | 4 +- assets/translations/pl.json | 2 + assets/translations/pt.json | 2 + assets/translations/ru.json | 2 + assets/translations/sv.json | 4 +- assets/translations/tr.json | 2 + assets/translations/uk.json | 3 +- assets/translations/vi.json | 2 + assets/translations/zh.json | 2 + lib/pages/settings.dart | 69 +++++++++++++++++++++------- lib/providers/apps_provider.dart | 35 +++++++++++--- lib/providers/settings_provider.dart | 9 ++++ 22 files changed, 133 insertions(+), 29 deletions(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 294654e..a3e935a 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -299,6 +299,8 @@ "note": "Note", "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", "badDownload": "The APK could not be parsed (incompatible or partial download)", + "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", + "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index f403304..33fa372 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'", "dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK", "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace", - "gitlabPATLabel": "GitLab Personal Access Token", + "gitlabPATLabel": "Osobní přístupový token GitLab", "about": "O", "requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)", "checkOnStart": "Zkontrolovat jednou při spuštění", @@ -299,6 +299,8 @@ "note": "Poznámka", "selfHostedNote": "Rozbalovací seznam \"{}\" lze použít k dosažení vlastních/obvyklých instancí libovolného zdroje.", "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)", + "beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)", + "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 40d2315..4d711bf 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -299,6 +299,8 @@ "note": "Hinweis", "selfHostedNote": "Das „{}“-Dropdown-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.", "badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)", + "beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)", + "appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index f6220bb..23b389e 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -299,6 +299,8 @@ "note": "Note", "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", "badDownload": "The APK could not be parsed (incompatible or partial download)", + "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", + "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index 0f512e8..69b085c 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -299,6 +299,8 @@ "note": "Nota", "selfHostedNote": "El desplegable \"{}\" puede utilizarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.", "badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)", + "beforeNewInstallsShareToAppVerifier": "Compartir nuevas aplicaciones con AppVerifier (si está disponible)", + "appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 7929634..10731d6 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -299,6 +299,8 @@ "note": "Note", "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", "badDownload": "The APK could not be parsed (incompatible or partial download)", + "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", + "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index f61527e..61be34e 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -299,6 +299,8 @@ "note": "Note", "selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.", "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", + "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", + "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 277f6a6..5e9c669 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", - "gitlabPATLabel": "GitLab Personal Access Token", + "gitlabPATLabel": "GitLab személyes hozzáférési token", "about": "Rólunk", "requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", "checkOnStart": "Egyszer az alkalmazás indításakor is", @@ -299,6 +299,8 @@ "note": "Megjegyzés:", "selfHostedNote": "A \"{}\" legördülő menü használható bármely forrás saját üzemeltetésű/egyéni példányainak eléréséhez.", "badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)", + "beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)", + "appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazásokat?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 2e4b0d1..e6aa2a4 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'", "dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK", "moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista", - "gitlabPATLabel": "GitLab Personal Access Token", + "gitlabPATLabel": "GitLab Token di accesso personale", "about": "Informazioni", "requiresCredentialsInSettings": "{}: Servono credenziali aggiuntive (in Impostazioni)", "checkOnStart": "Controlla una volta all'avvio", @@ -299,6 +299,8 @@ "note": "Nota", "selfHostedNote": "Il menu a tendina \"{}\" può essere usato per raggiungere istanze autogestite/personali di qualsiasi fonte.", "badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).", + "beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)", + "appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index af5db0c..171167e 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -299,6 +299,8 @@ "note": "注", "selfHostedNote": "ドロップダウン\"{}\"を使用すると、あらゆるソースのセルフホスト/カスタムインスタンスにアクセスできます。", "badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。", + "beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する(利用可能な場合)", + "appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/nl.json b/assets/translations/nl.json index f946b5a..845676d 100644 --- a/assets/translations/nl.json +++ b/assets/translations/nl.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Geen waarschuwingen voor 'Track-Only' weergeven", "dontShowAPKOriginWarnings": "APK-herkomstwaarschuwingen niet weergeven", "moveNonInstalledAppsToBottom": "Verplaats niet-geïnstalleerde apps naar de onderkant van de apps-weergave", - "gitlabPATLabel": "GitLab Personal Access Token", + "gitlabPATLabel": "GitLab persoonlijk toegangskenmerk", "about": "Over", "requiresCredentialsInSettings": "{}: Dit vereist aanvullende referenties (in Instellingen)", "checkOnStart": "Controleren op updates bij opstarten", @@ -299,6 +299,8 @@ "note": "Opmerking", "selfHostedNote": "De \"{}\" dropdown kan gebruikt worden om zelf gehoste/aangepaste instanties van elke bron te bereiken.", "badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)", + "beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)", + "appVerifierInstructionToast": "Deel naar AppVerifier en keer hier terug als je klaar bent.", "removeAppQuestion": { "one": "App verwijderen?", "other": "Apps verwijderen?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index f24aceb..c017f93 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -299,6 +299,8 @@ "note": "Uwaga", "selfHostedNote": "Lista rozwijana \"{}\" może być używana do uzyskiwania dostępu do samodzielnie hostowanych / niestandardowych instancji dowolnego źródła.", "badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).", + "beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)", + "appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 2473c73..c2281d9 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -299,6 +299,8 @@ "note": "Nota", "selfHostedNote": "O menu suspenso \"{}\" pode ser usado para acessar instâncias auto-hospedadas/personalizadas de qualquer fonte.", "badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)", + "beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)", + "appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.", "removeAppQuestion": { "one": "Remover aplicativo?", "other": "Remover aplicativos?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 52a42fb..c5233d5 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -299,6 +299,8 @@ "note": "Примечание", "selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.", "badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)", + "beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)", + "appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/sv.json b/assets/translations/sv.json index 44baa29..5713536 100644 --- a/assets/translations/sv.json +++ b/assets/translations/sv.json @@ -218,7 +218,7 @@ "dontShowTrackOnlyWarnings": "Visa inte 'Följ-Endast' varningar", "dontShowAPKOriginWarnings": "Visa inte APK-ursprung varningar", "moveNonInstalledAppsToBottom": "Flytta icke-installerade appar till botten av appvyn", - "gitlabPATLabel": "GitLab Personal Access Token", + "gitlabPATLabel": "Personligt åtkomsttoken för GitLab", "about": "Om", "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", "checkOnStart": "Kolla efter uppdateringar vid start", @@ -299,6 +299,8 @@ "note": "Anmärkning", "selfHostedNote": "Rullgardinsmenyn \"{}\" kan användas för att nå självhostade/anpassade instanser av valfri källa.", "badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)", + "beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)", + "appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.", "removeAppQuestion": { "one": "Ta Bort App?", "other": "Ta Bort Appar?" diff --git a/assets/translations/tr.json b/assets/translations/tr.json index 240a0c1..176663a 100644 --- a/assets/translations/tr.json +++ b/assets/translations/tr.json @@ -299,6 +299,8 @@ "note": "Not", "selfHostedNote": "\"{}\" açılır menüsü, herhangi bir kaynağın kendi kendine barındırılan/özel örneklerine ulaşmak için kullanılabilir.", "badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)", + "beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)", + "appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.", "removeAppQuestion": { "one": "Uygulamayı Kaldır?", "other": "Uygulamaları Kaldır?" diff --git a/assets/translations/uk.json b/assets/translations/uk.json index c971034..327d5fa 100644 --- a/assets/translations/uk.json +++ b/assets/translations/uk.json @@ -232,7 +232,6 @@ "addInfoBelow": "Додати цю інформацію нижче.", "addInfoInSettings": "Додати цю інформацію у налаштуваннях.", "githubSourceNote": "Лімітування швидкості GitHub можна уникнути, використовуючи ключ API.", - "gitlabSourceNote": "Вилучення APK з GitLab може не працювати без ключа API.", "sortByLastLinkSegment": "Сортувати лише за останнім сегментом посилання", "filterReleaseNotesByRegEx": "Фільтрувати примітки до релізу за регулярним виразом", "customLinkFilterRegex": "Фільтр кастомного посилання на APK за регулярним виразом (за замовчуванням '.apk$')", @@ -300,6 +299,8 @@ "note": "Примітка", "selfHostedNote": "Випадаючий список \"{}\" може використовуватися для доступу до власних/призначених для самостійного використання екземплярів будь-якого джерела.", "badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)", + "beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)", + "appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.", "removeAppQuestion": { "one": "Видалити застосунок?", "other": "Видалити застосунки?" diff --git a/assets/translations/vi.json b/assets/translations/vi.json index 51b1f4f..951f209 100644 --- a/assets/translations/vi.json +++ b/assets/translations/vi.json @@ -299,6 +299,8 @@ "note": "Ghi chú", "selfHostedNote": "Trình đơn thả xuống \"{}\" có thể được dùng để tiếp cận các phiên bản tự lưu trữ/tùy chỉnh của bất kỳ nguồn nào.", "badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)", + "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", + "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", "removeAppQuestion": { "one": "Gỡ ứng dụng?", "other": "Gỡ ứng dụng?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 8e7e8ad..ed1482c 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -299,6 +299,8 @@ "note": "备注", "selfHostedNote": "可以通过“{}”下拉菜单来指向任意来源的自托管/自定义实例。", "badDownload": "无法解析 APK 文件(不兼容或文件不完整)", + "beforeNewInstallsShareToAppVerifier": "与 AppVerifier 共享新应用程序(如有)", + "appVerifierInstructionToast": "分享到 AppVerifier,准备就绪后返回此处。", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 5cc56a2..bdf51e1 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -351,6 +351,22 @@ class _SettingsPageState extends State { ], ), height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: + Text(tr('removeOnExternalUninstall'))), + Switch( + value: settingsProvider + .removeOnExternalUninstall, + onChanged: (value) { + settingsProvider + .removeOnExternalUninstall = value; + }) + ], + ), + height16, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -363,6 +379,43 @@ class _SettingsPageState extends State { }) ], ), + height16, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(tr( + 'beforeNewInstallsShareToAppVerifier')), + GestureDetector( + onTap: () { + launchUrlString( + 'https://github.com/soupslurpr/AppVerifier', + mode: LaunchMode + .externalApplication); + }, + child: Text( + tr('about'), + style: const TextStyle( + decoration: + TextDecoration.underline, + fontSize: 12), + )), + ], + )), + Switch( + value: settingsProvider + .beforeNewInstallsShareToAppVerifier, + onChanged: (value) { + settingsProvider + .beforeNewInstallsShareToAppVerifier = + value; + }) + ], + ), installMethodDropdown, height32, Text( @@ -474,22 +527,6 @@ class _SettingsPageState extends State { ], ), height16, - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - child: - Text(tr('removeOnExternalUninstall'))), - Switch( - value: settingsProvider - .removeOnExternalUninstall, - onChanged: (value) { - settingsProvider - .removeOnExternalUninstall = value; - }) - ], - ), - height16, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 7f4efed..be8ceb5 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:math'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:crypto/crypto.dart'; @@ -31,6 +32,7 @@ import 'package:obtainium/providers/source_provider.dart'; import 'package:http/http.dart'; import 'package:android_intent_plus/android_intent.dart'; import 'package:flutter_archive/flutter_archive.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:shared_storage/shared_storage.dart' as saf; import 'native_provider.dart'; @@ -561,7 +563,8 @@ class AppsProvider with ChangeNotifier { zipFile: File(filePath), destinationDir: Directory(destinationPath)); } - Future installXApkDir(DownloadedXApkDir dir, + Future installXApkDir( + DownloadedXApkDir dir, BuildContext? firstTimeWithContext, {bool needsBGWorkaround = false}) async { // We don't know which APKs in an XAPK are supported by the user's device // So we try installing all of them and assume success if at least one installed @@ -575,7 +578,8 @@ class AppsProvider with ChangeNotifier { if (file.path.toLowerCase().endsWith('.apk')) { try { somethingInstalled = somethingInstalled || - await installApk(DownloadedApk(dir.appId, file), + await installApk( + DownloadedApk(dir.appId, file), firstTimeWithContext, needsBGWorkaround: needsBGWorkaround); } catch (e) { logs.add( @@ -597,8 +601,19 @@ class AppsProvider with ChangeNotifier { return somethingInstalled; } - Future installApk(DownloadedApk file, + Future installApk( + DownloadedApk file, BuildContext? firstTimeWithContext, {bool needsBGWorkaround = false}) async { + if (firstTimeWithContext != null && + settingsProvider.beforeNewInstallsShareToAppVerifier && + (await getInstalledInfo('dev.soupslurpr.appverifier')) != null) { + XFile f = XFile.fromData(file.file.readAsBytesSync(), + mimeType: 'application/vnd.android.package-archive'); + Fluttertoast.showToast( + msg: tr('appVerifierInstructionToast'), + toastLength: Toast.LENGTH_LONG); + await Share.shareXFiles([f]); + } var newInfo = await pm.getPackageArchiveInfo(archiveFilePath: file.file.path); if (newInfo == null) { @@ -834,17 +849,23 @@ class AppsProvider with ChangeNotifier { try { if (!skipInstalls) { bool sayInstalled = true; + var contextIfNewInstall = + apps[id]?.installedInfo == null ? context : null; if (downloadedFile != null) { if (willBeSilent && context == null) { - installApk(downloadedFile, needsBGWorkaround: true); + installApk(downloadedFile, contextIfNewInstall, + needsBGWorkaround: true); } else { - sayInstalled = await installApk(downloadedFile); + sayInstalled = + await installApk(downloadedFile, contextIfNewInstall); } } else { if (willBeSilent && context == null) { - installXApkDir(downloadedDir!, needsBGWorkaround: true); + installXApkDir(downloadedDir!, contextIfNewInstall, + needsBGWorkaround: true); } else { - sayInstalled = await installXApkDir(downloadedDir!); + sayInstalled = + await installXApkDir(downloadedDir!, contextIfNewInstall); } } if (willBeSilent && context == null) { diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 1b0edcc..b9b910a 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -479,4 +479,13 @@ class SettingsProvider with ChangeNotifier { prefs?.setStringList('searchDeselected', list); notifyListeners(); } + + bool get beforeNewInstallsShareToAppVerifier { + return prefs?.getBool('beforeNewInstallsShareToAppVerifier') ?? true; + } + + set beforeNewInstallsShareToAppVerifier(bool val) { + prefs?.setBool('beforeNewInstallsShareToAppVerifier', val); + notifyListeners(); + } } From 6468d0edcc35a91dce9e67c859aad169f1bc4efc Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 28 Mar 2024 23:05:16 -0400 Subject: [PATCH 49/58] Fix GitLab's broken track-only mode (#1496) --- lib/app_sources/gitlab.dart | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 42a00a0..53e0689 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -121,9 +121,11 @@ class GitLab extends AppSource { String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; + bool trackOnly = additionalSettings['trackOnly'] == true; + // Request data from REST API Response res = await sourceRequest( - 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?$optionalAuth', + 'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', additionalSettings); if (res.statusCode != 200) { throw getObtainiumHttpError(res); @@ -152,9 +154,8 @@ class GitLab extends AppSource { var apkUrlsSet = apkUrlsFromAssets.toSet(); apkUrlsSet.addAll(uploadedAPKsFromDescription); var releaseDateString = e['released_at'] ?? e['created_at']; - DateTime? releaseDate = releaseDateString != null - ? DateTime.parse(releaseDateString) - : null; + DateTime? releaseDate = + releaseDateString != null ? DateTime.parse(releaseDateString) : null; return APKDetails( e['tag_name'] ?? e['name'], getApkUrlsFromUrls(apkUrlsSet.toList()), @@ -164,18 +165,19 @@ class GitLab extends AppSource { if (apkDetailsList.isEmpty) { throw NoReleasesError(); } + var finalResult = apkDetailsList.first; // Fallback procedure bool fallbackToOlderReleases = additionalSettings['fallbackToOlderReleases'] == true; - if (fallbackToOlderReleases) { - if (additionalSettings['trackOnly'] != true) { - apkDetailsList = - apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); - } - if (apkDetailsList.isEmpty) { - throw NoReleasesError(); - } + if (finalResult.apkUrls.isEmpty && fallbackToOlderReleases && !trackOnly) { + apkDetailsList = + apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); + finalResult = apkDetailsList.first; + } + + if (finalResult.apkUrls.isEmpty && !trackOnly) { + throw NoAPKError(); } return apkDetailsList.first; From a8838572300b8a83ffc5a4f1844bbd30a42ecf13 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 28 Mar 2024 23:13:45 -0400 Subject: [PATCH 50/58] Auto-delete download if likely invalid (#1498) --- lib/providers/apps_provider.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index be8ceb5..1c24a27 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -291,11 +291,14 @@ Future downloadFile( return s; }).pipe(sink); await sink.close(); + bool likelyCorruptFile = (progress ?? 0) > 101; progress = null; if (onProgress != null) { onProgress(progress); } - if (response.statusCode < 200 || response.statusCode > 299) { + if (response.statusCode < 200 || + response.statusCode > 299 || + likelyCorruptFile) { tempDownloadedFile.deleteSync(recursive: true); throw response.reasonPhrase ?? tr('unexpectedError'); } From 491c42d68b2d342d1ec1eb2691af0db1c620fd1c Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 28 Mar 2024 23:27:22 -0400 Subject: [PATCH 51/58] Removed SourceForge (#1487) --- README.md | 1 - lib/providers/source_provider.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/README.md b/README.md index 3acfdf2..9d8e321 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,6 @@ Currently supported App sources: - [F-Droid](https://f-droid.org/) - Third Party F-Droid Repos - [IzzyOnDroid](https://android.izzysoft.de/) - - [SourceForge](https://sourceforge.net/) - [SourceHut](https://git.sr.ht/) - Other - General: - [APKPure](https://apkpure.net/) diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index d2c34bf..7761f61 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -736,7 +736,6 @@ class SourceProvider { FDroid(), FDroidRepo(), IzzyOnDroid(), - SourceForge(), SourceHut(), APKPure(), Aptoide(), From f2c15c5c8ee67ff01222227075dce7f1861614e2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 28 Mar 2024 23:40:36 -0400 Subject: [PATCH 52/58] Update packages and Flutter, increment version --- .flutter | 2 +- pubspec.lock | 60 ++++++++++++++++++++++++++-------------------------- pubspec.yaml | 12 +++++------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.flutter b/.flutter index ba39319..300451a 160000 --- a/.flutter +++ b/.flutter @@ -1 +1 @@ -Subproject commit ba393198430278b6595976de84fe170f553cc728 +Subproject commit 300451adae589accbece3490f4396f10bdf15e6e diff --git a/pubspec.lock b/pubspec.lock index a3b488c..28bb66d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: "direct main" description: name: android_intent_plus - sha256: e1c62bb41c90e15083b7fb84dc327fe90396cc9c1445b55ff1082144fabfb4d9 + sha256: e92d14009f3f6ebafca6a601958aaebb793559fb03a1961fe3c5596db95af2cb url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "5.0.1" android_package_installer: dependency: "direct main" description: @@ -38,10 +38,10 @@ packages: dependency: "direct main" description: name: app_links - sha256: fd7fc1569870b4b0d90d17a9f36661a6ff92400fecb6e4adab4abe0f0488bb5f + sha256: "42dc15aecf2618ace4ffb74a2e58a50e45cd1b9f2c17c8f0cafe4c297f08c815" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" archive: dependency: transitive description: @@ -70,10 +70,10 @@ packages: dependency: "direct main" description: name: background_fetch - sha256: eb3af263d390d7e68ecb90f2ae984d2bfd96dceb4c7b4f72418dd5383b49de0a + sha256: dbffec0317ccdef6e2014cb543e147f52441e29c4fcb53dfd23558c4d92ddece url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "1.3.2" boolean_selector: dependency: transitive description: @@ -126,18 +126,18 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + sha256: e9feae83b1849f61bad9f6f33ee00646e3410d54ce0821e02f262f9901dad3c9 url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "6.0.1" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "2.0.0" convert: dependency: transitive description: @@ -190,10 +190,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + sha256: "50fb435ed30c6d2525cbfaaa0f46851ea6131315f213c0d921b0e407b34e3b84" url: "https://pub.dev" source: hosted - version: "9.1.2" + version: "10.0.1" device_info_plus_platform_interface: dependency: transitive description: @@ -254,10 +254,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: caa6bc229eab3e32eb2f37b53a5f9d22a6981474afd210c512a7546c1e1a04f6 + sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "8.0.0+1" fixnum: dependency: transitive description: @@ -299,10 +299,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" flutter_local_notifications: dependency: "direct main" description: @@ -336,10 +336,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: cb44f7831b23a6bdd0f501718b0d2e8045cbc625a15f668af37ddb80314821db + sha256: "87e11b9df25a42e2db315b8b7a51fae8e66f57a4b2f50ec4b822d0fa155e6b52" url: "https://pub.dev" source: hosted - version: "0.6.21" + version: "0.6.22" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -426,10 +426,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: transitive description: @@ -586,10 +586,10 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44" + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" url: "https://pub.dev" source: hosted - version: "11.3.0" + version: "11.3.1" permission_handler_android: dependency: transitive description: @@ -602,10 +602,10 @@ packages: dependency: transitive description: name: permission_handler_apple - sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b + sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "9.4.4" permission_handler_html: dependency: transitive description: @@ -618,10 +618,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" + sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.2.1" permission_handler_windows: dependency: transitive description: @@ -674,18 +674,18 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + sha256: "05ec043470319bfbabe0adbc90d3a84cbff0426b9d9f3a6e2ad3e131fa5fa629" url: "https://pub.dev" source: hosted - version: "7.2.2" + version: "8.0.2" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 0d987f6..3d8195a 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.6+2256 # When changing this, update the tag in main() accordingly +version: 1.1.0+2257 environment: sdk: '>=3.0.0 <4.0.0' @@ -48,22 +48,22 @@ dependencies: url_launcher: ^6.1.5 permission_handler: ^11.0.0 fluttertoast: ^8.0.9 - device_info_plus: ^9.0.0 - file_picker: ^6.0.0 + device_info_plus: ^10.0.1 + file_picker: ^8.0.0+1 animations: ^2.0.4 android_package_installer: git: url: https://github.com/ImranR98/android_package_installer ref: main android_package_manager: ^0.7.0 - share_plus: ^7.0.0 + share_plus: ^8.0.2 sqflite: ^2.2.0+3 easy_localization: ^3.0.1 - android_intent_plus: ^4.0.0 + android_intent_plus: ^5.0.1 flutter_markdown: ^0.6.14 flutter_archive: ^6.0.0 hsluv: ^1.1.3 - connectivity_plus: ^5.0.0 + connectivity_plus: ^6.0.1 shared_storage: ^0.8.0 crypto: ^3.0.3 app_links: ^4.0.0 From 35da44bc645cc065b76910403cadadaedddb7f7e Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:00:53 -0400 Subject: [PATCH 53/58] Update release.yml --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f35af1a..7bdf66b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,8 @@ jobs: - uses: actions/checkout@v3 - uses: subosito/flutter-action@v2 + with: + java-version: '17.x' - name: Import GPG key id: import_pgp_key From 1019a01249161cb07e70d1c75b758ee2931a0d85 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:02:11 -0400 Subject: [PATCH 54/58] Update release.yml --- .github/workflows/release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7bdf66b..f35af1a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,8 +15,6 @@ jobs: - uses: actions/checkout@v3 - uses: subosito/flutter-action@v2 - with: - java-version: '17.x' - name: Import GPG key id: import_pgp_key From db755e0f90ca6d0c3d6fd94f37d7383ca6a1b6ca Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:14:26 -0400 Subject: [PATCH 55/58] Update release.yml --- .github/workflows/release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f35af1a..c5f89a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,6 +16,12 @@ jobs: - uses: actions/checkout@v3 - uses: subosito/flutter-action@v2 + - name: Temp + id: temp + run: | + echo $JAVA_HOME + find . | grep /javac$ + - name: Import GPG key id: import_pgp_key uses: crazy-max/ghaction-import-gpg@v6 From 85941349d8c3226583061b6b9fcf52b5e8851e64 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:17:35 -0400 Subject: [PATCH 56/58] Update release.yml --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c5f89a4..15ef9a1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,8 +19,7 @@ jobs: - name: Temp id: temp run: | - echo $JAVA_HOME - find . | grep /javac$ + flutter doctor -v - name: Import GPG key id: import_pgp_key From 677790af9c707f7e33722e0dce650bc91f50fb49 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:22:43 -0400 Subject: [PATCH 57/58] Update release.yml --- .github/workflows/release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 15ef9a1..6db7903 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,10 @@ jobs: - uses: actions/checkout@v3 - uses: subosito/flutter-action@v2 + - uses: actions/setup-java@v4 + with: + distribution: 'temurin' # See 'Supported distributions' for available options + java-version: '17' - name: Temp id: temp From f3d2dfe3860ac20484316616250c18b721285405 Mon Sep 17 00:00:00 2001 From: Imran <30463115+ImranR98@users.noreply.github.com> Date: Fri, 29 Mar 2024 00:23:06 -0400 Subject: [PATCH 58/58] Update release.yml --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6db7903..19e5b7c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,8 +20,8 @@ jobs: distribution: 'temurin' # See 'Supported distributions' for available options java-version: '17' - - name: Temp - id: temp + - name: Flutter Doctor + id: flutter_doctor run: | flutter doctor -v