From f3632a403310e7e50cad051675737651668af7d2 Mon Sep 17 00:00:00 2001 From: LucasTavaresA Date: Sat, 23 Sep 2023 19:18:54 +0000 Subject: [PATCH 01/85] Update pt.json --- assets/translations/pt.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 6e26a2e..1271fc5 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -128,7 +128,7 @@ "pinUpdates": "Fixar atualizações no topo da visão de Apps", "updates": "Atualizações", "sourceSpecific": "Específico a fonte", - "appSource": "Fonte de Apps", + "appSource": "Fonte do App", "noLogs": "Sem Logs", "appLogs": "Logs do App", "close": "Fechar", @@ -250,19 +250,19 @@ "intermediateLinkNotFound": "Link intermediário não encontrado", "exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (se ativadas)", "bgUpdatesOnWiFiOnly": "Desative atualizações em segundo plano quando não estiver em WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "autoSelectHighestVersionCode": "Auto-selecionar o maior codigo de versão", + "versionExtractionRegEx": "RegEx para Extração de Versão", + "matchGroupToUse": "Grupo de Seleção para Usar", + "highlightTouchTargets": "Destaque areas de toque menos óbvias", + "pickExportDir": "Escolher Diretorio de Exportação", + "autoExportOnChanges": "Auto-exportar em mudanças", + "filterVersionsByRegEx": "Filtrar Versões por Expressão Regular", + "trySelectingSuggestedVersionCode": "Tente selecionar a versão sugerida", + "dontSortReleasesList": "Reter a ordem de lançamento da API", + "reverseSort": "Ordenação reversa", + "debugMenu": "Menu Debug", + "bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.", + "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" From 70162da491d8267c53e72019fc998e218d4b0ae6 Mon Sep 17 00:00:00 2001 From: Tangy Wrecker <86275501+TangyWrecker@users.noreply.github.com> Date: Tue, 26 Sep 2023 01:09:19 +0300 Subject: [PATCH 02/85] Update ru.json --- assets/translations/ru.json | 59 +++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/assets/translations/ru.json b/assets/translations/ru.json index f9b78c0..ee96354 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -236,30 +236,33 @@ "addInfoInSettings": "Добавьте эту информацию в Настройки.", "githubSourceNote": "Лимит запросов GitHub можно обойти, используя ключ API.", "gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.", - "sortByFileNamesNotLinks": "Sort by file names instead of full links", - "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", - "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", - "appsPossiblyUpdated": "App Updates Attempted", - "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", - "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", - "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", - "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", - "verifyLatestTag": "Verify the 'latest' tag", - "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", - "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "sortByFileNamesNotLinks": "Сортировать по именам файлов, а не по полным ссылкам", + "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску по регулярному выражению", + "customLinkFilterRegex": "Пользовательский фильтр ссылок APK по регулярному выражению (по умолчанию '.apk$')", + "appsPossiblyUpdated": "Попытки обновления приложений", + "appsPossiblyUpdatedNotifDescription": "Уведомляет пользователя о возможных обновлениях одного или нескольких приложений в фоновом режиме", + "xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}.", + "enableBackgroundUpdates": "Включить обновления в фоне", + "backgroundUpdateReqsExplanation": "Фоновые обновления могут быть невозможны для всех приложений.", + "backgroundUpdateLimitsExplanation": "Успех фоновой установки можно определить только после открытия Obtainium.", + "verifyLatestTag": "Проверьте тег 'последний'", + "intermediateLinkRegex": "Фильтр ссылок 'промежуточного' типа для приоритетного посещения", + "intermediateLinkNotFound": "Промежуточная ссылка не найдена", + "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", + "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", + "autoSelectHighestVersionCode": "Автоматически выбирать APK с наивысшим кодом версии", + "versionExtractionRegEx": "Регулярное выражение для извлечения версии", + "matchGroupToUse": "Выберите группу для использования", + "highlightTouchTargets": "Выделить менее очевидные элементы управления касанием", + "pickExportDir": "Выбрать каталог для экспорта", + "autoExportOnChanges": "Автоэкспорт при изменениях", + "filterVersionsByRegEx": "Фильтровать версии по регулярному выражению", + "trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK", + "dontSortReleasesList": "Сохранить порядок выпусков от API", + "reverseSort": "Обратная сортировка", + "debugMenu": "Меню Отладки", + "bgTaskStarted": "Фоновая задача начата - проверьте журналы.", + "runBgCheckNow": "Запустить проверку фонового обновления сейчас", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" @@ -305,11 +308,11 @@ "other": "У {} и ещё {} приложений есть обновления." }, "xAndNMoreUpdatesInstalled": { - "one": "{} и еще 1 приложение были обновлены.", - "other": "{} и еще {} приложений были обновлены." + "one": "{} и ещё 1 приложение были обновлены.", + "other": "{} и ещё {} приложений были обновлены." }, "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} and 1 more app may have been updated.", - "other": "{} and {} more apps may have been updated." + "one": "{} и ещё 1 приложение могли быть обновлены.", + "other": "{} и ещё {} приложений могли быть обновлены." } } From db3a262410236bb61e3b7bef509d86cd58150f34 Mon Sep 17 00:00:00 2001 From: Tangy Wrecker <86275501+TangyWrecker@users.noreply.github.com> Date: Tue, 26 Sep 2023 01:13:01 +0300 Subject: [PATCH 03/85] Update ru.json oops --- assets/translations/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/translations/ru.json b/assets/translations/ru.json index ee96354..8ea5c0f 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -242,12 +242,12 @@ "appsPossiblyUpdated": "Попытки обновления приложений", "appsPossiblyUpdatedNotifDescription": "Уведомляет пользователя о возможных обновлениях одного или нескольких приложений в фоновом режиме", "xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}.", - "enableBackgroundUpdates": "Включить обновления в фоне", + "enableBackgroundUpdates": "Включить обновления в фоне", "backgroundUpdateReqsExplanation": "Фоновые обновления могут быть невозможны для всех приложений.", "backgroundUpdateLimitsExplanation": "Успех фоновой установки можно определить только после открытия Obtainium.", "verifyLatestTag": "Проверьте тег 'последний'", "intermediateLinkRegex": "Фильтр ссылок 'промежуточного' типа для приоритетного посещения", - "intermediateLinkNotFound": "Промежуточная ссылка не найдена", + "intermediateLinkNotFound": "Промежуточная ссылка не найдена", "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", "autoSelectHighestVersionCode": "Автоматически выбирать APK с наивысшим кодом версии", From 7e85ccaf285d4bd1c0370535e3ae3dda7c0ea1c6 Mon Sep 17 00:00:00 2001 From: Daviteusz Date: Fri, 29 Sep 2023 02:36:17 +0200 Subject: [PATCH 04/85] locale(pl): Update Polish translations --- assets/translations/pl.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 6001dbc..0cf28fd 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -34,10 +34,10 @@ "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", "uname": "Nazwa użytkownika", "wrongArgNum": "Nieprawidłowa liczba podanych argumentów", - "xIsTrackOnly": "{} jest tylko obserwowana", + "xIsTrackOnly": "{} jest tylko obserwowane", "source": "Źródło", "app": "Aplikacja", - "appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „Obserwowane”.", + "appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „tylko obserwowane”.", "youPickedTrackOnly": "Wybrano opcję „Tylko obserwuj”.", "trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.", "cancelled": "Anulowano", @@ -52,7 +52,7 @@ "additionalOptsFor": "Dodatkowe opcje dla {}", "supportedSources": "Obsługiwane źródła", "trackOnlyInBrackets": "(tylko obserwowane)", - "searchableInBrackets": "(Wyszukiwalne)", + "searchableInBrackets": "(wyszukiwalne)", "appsString": "Aplikacje", "noApps": "Brak aplikacji", "noAppsForFilter": "Brak aplikacji dla filtra", @@ -70,7 +70,7 @@ "removeSelectedApps": "Usuń wybrane aplikacje", "updateX": "Zaktualizuj {}", "installX": "Zainstaluj {}", - "markXTrackOnlyAsUpdated": "Oznacz {}\n(Tylko obserwowana)\njako zaktualizowaną", + "markXTrackOnlyAsUpdated": "Oznacz {}\n(tylko obserwowana)\njako zaktualizowaną", "changeX": "Zmień {}", "installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", @@ -261,11 +261,11 @@ "autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian", "filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego", "trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API", + "reverseSort": "Odwrotne sortowanie", + "debugMenu": "Menu debugowania", + "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", + "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", From c9cb865c9c77a9f800d343353ac1af1bee636e75 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 29 Sep 2023 12:13:11 -0400 Subject: [PATCH 05/85] Add export dir pick button + update packages --- lib/main.dart | 2 +- lib/pages/import_export.dart | 32 +++++++++++++++++++++++++------- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 114dae6..dfca6a9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.20'; +const String currentVersion = '0.14.21'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 159d38a..264f3a9 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -102,11 +102,12 @@ class _ImportExportPageState extends State { }); } - runObtainiumExport() async { + runObtainiumExport({bool pickOnly = false}) async { HapticFeedback.selectionClick(); appsProvider .exportApps( - pickOnly: (await settingsProvider.getExportDir()) == null, + pickOnly: + pickOnly || (await settingsProvider.getExportDir()) == null, sp: settingsProvider) .then((String? result) { if (result != null) { @@ -320,21 +321,38 @@ class _ImportExportPageState extends State { onPressed: appsProvider.apps.isEmpty || importInProgress ? null - : runObtainiumExport, - child: Text(tr(snapshot.data != null - ? 'obtainiumExport' - : 'pickExportDir')), + : () { + runObtainiumExport(pickOnly: true); + }, + child: Text(tr('pickExportDir')), )), const SizedBox( width: 16, ), + Expanded( + child: TextButton( + style: outlineButtonStyle, + onPressed: appsProvider.apps.isEmpty || + importInProgress || + snapshot.data == null + ? null + : runObtainiumExport, + child: Text(tr('obtainiumExport')), + )), + ], + ), + const SizedBox( + height: 8, + ), + Row( + children: [ Expanded( child: TextButton( style: outlineButtonStyle, onPressed: importInProgress ? null : runObtainiumImport, - child: Text(tr('obtainiumImport')))) + child: Text(tr('obtainiumImport')))), ], ), if (snapshot.data != null) diff --git a/pubspec.lock b/pubspec.lock index fc2bdb5..ec8571d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -46,10 +46,10 @@ packages: dependency: transitive description: name: archive - sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" + sha256: d4dc11707abb32ef756ab95678c0d6df54003d98277f7c9aeda14c48e7a38c2f url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.4.3" args: dependency: transitive description: @@ -386,10 +386,10 @@ packages: dependency: transitive description: name: image - sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888" + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.1.3" intl: dependency: transitive description: @@ -546,10 +546,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f + sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790 url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.0.5" permission_handler_apple: dependency: transitive description: @@ -911,10 +911,10 @@ packages: dependency: transitive description: name: win32 - sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" url: "https://pub.dev" source: hosted - version: "5.0.8" + version: "5.0.9" win32_registry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 17d8771..0c648ab 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: 0.14.20+212 # When changing this, update the tag in main() accordingly +version: 0.14.21+213 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From 4bc9f5826eba3b0940045bfe53f1d6b914e679e6 Mon Sep 17 00:00:00 2001 From: Matsuri Date: Sat, 30 Sep 2023 20:30:00 +0800 Subject: [PATCH 06/85] Update zh.json - Translate new strings - Slight improvements Signed-off-by: Matsuri --- assets/translations/zh.json | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 81a2007..69954f9 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -238,31 +238,31 @@ "gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。", "sortByFileNamesNotLinks": "使用文件名代替链接进行排序", "filterReleaseNotesByRegEx": "使用正则表达式筛选发行说明", - "customLinkFilterRegex": "使用正则表达式自定义链接筛选(默认模式为“.apk$”)", + "customLinkFilterRegex": "使用正则表达式筛选自定义来源 APK 文件链接\n(未填写时,默认匹配模式为“.apk$”)", "appsPossiblyUpdated": "已尝试更新应用", "appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知", - "xWasPossiblyUpdatedToY": "已尝试将 {} 更新至 {}。", + "xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。", "enableBackgroundUpdates": "启用后台更新", "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", "verifyLatestTag": "验证“Latest”标签", - "intermediateLinkRegex": "首先访问“中间”链接的过滤器", - "intermediateLinkNotFound": "中间链接未找到", - "exemptFromBackgroundUpdates": "禁用后台更新(如果全局设置启用)", - "bgUpdatesOnWiFiOnly": "不在连接 WiFi 时禁用后台更新", - "autoSelectHighestVersionCode": "自动选择最高版本号 APK", - "versionExtractionRegEx": "版本提取正则表达式", - "matchGroupToUse": "匹配要使用的组", - "highlightTouchTargets": "突出显示不明显的触摸目标", - "pickExportDir": "选择导出目录", - "autoExportOnChanges": "修改时自动导出", - "filterVersionsByRegEx": "使用正则表达式筛选版本", - "trySelectingSuggestedVersionCode": "尝试选择推荐版本 APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "intermediateLinkRegex": "筛选一个首先访问的“中转”链接(正则表达式)", + "intermediateLinkNotFound": "未找到“中转”链接", + "exemptFromBackgroundUpdates": "单独禁用后台更新(若已经全局启用)", + "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新", + "autoSelectHighestVersionCode": "自动选择版本号最高的 APK 文件", + "versionExtractionRegEx": "获取版本号的正则表达式", + "matchGroupToUse": "引用的捕获组", + "highlightTouchTargets": "突出展示不明显的触摸区域", + "pickExportDir": "选择导出文件夹", + "autoExportOnChanges": "数据变更时自动导出", + "filterVersionsByRegEx": "使用正则表达式筛选版本号", + "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件", + "dontSortReleasesList": "保持来自 API 的发行顺序", + "reverseSort": "反转排序", + "debugMenu": "调试选项", + "bgTaskStarted": "后台任务已启动 - 详见日志", + "runBgCheckNow": "立即进行后台更新检查", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" From 4c811c9c04d6f185f02f46dc70e08843cf3136b8 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 30 Sep 2023 10:12:49 -0400 Subject: [PATCH 07/85] "Naive" version detection for some Sources (#946) --- lib/app_sources/apkpure.dart | 1 + lib/app_sources/aptoide.dart | 1 + lib/app_sources/uptodown.dart | 1 + lib/providers/apps_provider.dart | 40 ++++++++++++++++++++---------- lib/providers/source_provider.dart | 1 + 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index d22e9a6..a86fa0d 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -22,6 +22,7 @@ class APKPure extends AppSource { APKPure() { host = 'apkpure.com'; allowSubDomains = true; + naiveStandardVersionDetection = true; } @override diff --git a/lib/app_sources/aptoide.dart b/lib/app_sources/aptoide.dart index 9543464..5b92b33 100644 --- a/lib/app_sources/aptoide.dart +++ b/lib/app_sources/aptoide.dart @@ -9,6 +9,7 @@ class Aptoide extends AppSource { host = 'aptoide.com'; name = tr('Aptoide'); allowSubDomains = true; + naiveStandardVersionDetection = true; } @override diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index dd9b68a..7b36cc3 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -8,6 +8,7 @@ class Uptodown extends AppSource { Uptodown() { host = 'uptodown.com'; allowSubDomains = true; + naiveStandardVersionDetection = true; } @override diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index a8c6fdf..2dc7498 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -709,14 +709,21 @@ class AppsProvider with ChangeNotifier { } bool isVersionDetectionPossible(AppInMemory? app) { - return app?.app.additionalSettings['trackOnly'] != true && - app?.app.additionalSettings['versionDetection'] != + if (app?.app == null) { + return false; + } + var naiveStandardVersionDetection = SourceProvider() + .getSource(app!.app.url, overrideSource: app.app.overrideSource) + .naiveStandardVersionDetection; + return app.app.additionalSettings['trackOnly'] != true && + app.app.additionalSettings['versionDetection'] != 'releaseDateAsVersion' && - app?.installedInfo?.versionName != null && - app?.app.installedVersion != null && - reconcileVersionDifferences( - app!.installedInfo!.versionName!, app.app.installedVersion!) != - null; + app.installedInfo?.versionName != null && + app.app.installedVersion != null && + (reconcileVersionDifferences(app.installedInfo!.versionName!, + app.app.installedVersion!) != + null || + naiveStandardVersionDetection); } // Given an App and it's on-device info... @@ -725,8 +732,13 @@ class AppsProvider with ChangeNotifier { App app, PackageInfo? installedInfo) { var modded = false; var trackOnly = app.additionalSettings['trackOnly'] == true; - var noVersionDetection = app.additionalSettings['versionDetection'] != - 'standardVersionDetection'; + var versionDetectionIsStandard = + app.additionalSettings['versionDetection'] == + 'standardVersionDetection'; + var naiveStandardVersionDetection = SourceProvider() + .getSource(app.url, overrideSource: app.overrideSource) + .naiveStandardVersionDetection; + ; // FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL if (installedInfo == null && app.installedVersion != null && !trackOnly) { // App says it's installed but isn't really (and isn't track only) - set to not installed @@ -741,7 +753,7 @@ class AppsProvider with ChangeNotifier { // SECOND, RECONCILE DIFFERENCES BETWEEN THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE NEITHER IS NULL if (installedInfo?.versionName != null && installedInfo!.versionName != app.installedVersion && - !noVersionDetection) { + versionDetectionIsStandard) { // App's reported version and real version don't match (and it uses standard version detection) // If they share a standard format (and are still different under it), update the reported version accordingly var correctedInstalledVersion = reconcileVersionDifferences( @@ -749,12 +761,15 @@ class AppsProvider with ChangeNotifier { if (correctedInstalledVersion?.key == false) { app.installedVersion = correctedInstalledVersion!.value; modded = true; + } else if (naiveStandardVersionDetection) { + app.installedVersion = installedInfo.versionName; + modded = true; } } // THIRD, RECONCILE THE APP'S REPORTED INSTALLED AND LATEST VERSIONS if (app.installedVersion != null && app.installedVersion != app.latestVersion && - !noVersionDetection) { + versionDetectionIsStandard) { // App's reported installed and latest versions don't match (and it uses standard version detection) // If they share a standard format, make sure the App's reported installed version uses that format var correctedInstalledVersion = @@ -766,8 +781,7 @@ class AppsProvider with ChangeNotifier { } // FOURTH, DISABLE VERSION DETECTION IF ENABLED AND THE REPORTED/REAL INSTALLED VERSIONS ARE NOT STANDARDIZED if (installedInfo != null && - app.additionalSettings['versionDetection'] == - 'standardVersionDetection' && + versionDetectionIsStandard && !isVersionDetectionPossible( AppInMemory(app, null, installedInfo, null))) { app.additionalSettings['versionDetection'] = 'noVersionDetection'; diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 43a0f1e..b4b732f 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -328,6 +328,7 @@ abstract class AppSource { bool changeLogIfAnyIsMarkDown = true; bool appIdInferIsOptional = false; bool allowSubDomains = false; + bool naiveStandardVersionDetection = false; AppSource() { name = runtimeType.toString(); From e3baf91037f401b59992eee7b9d6733f77d19a77 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 30 Sep 2023 10:16:10 -0400 Subject: [PATCH 08/85] Increment version, upgrade packages --- lib/main.dart | 2 +- pubspec.lock | 12 ++++++------ pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index dfca6a9..1f2815e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.21'; +const String currentVersion = '0.14.22'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.lock b/pubspec.lock index ec8571d..51a04bc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -879,18 +879,18 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755" + sha256: "053d454c9475546b4382e9498601fb46293cdac9b3ca93f1a738375bc9a1eee4" url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "4.3.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: ddc167c6676f57c8b367d19fcbee267d6dc6adf81bd6c3cb87981d30746e0a6d + sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff url: "https://pub.dev" source: hosted - version: "3.10.1" + version: "3.12.0" webview_flutter_platform_interface: dependency: transitive description: @@ -903,10 +903,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "485af05f2c5f83c7f78c20e236b170ad02df7153b299ae9917345be43871d29f" + sha256: "3c7d56ca4b82654ad1f58aeefb8d593a59224f26d6b2bf8feed074361eb34c86" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0c648ab..af466c0 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: 0.14.21+213 # When changing this, update the tag in main() accordingly +version: 0.14.22+214 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From c72a41db9d20abc977466a5c2228bbcfd8e7904b Mon Sep 17 00:00:00 2001 From: DwainZwerg <97027379+DwainZwerg@users.noreply.github.com> Date: Sun, 1 Oct 2023 12:05:49 +0000 Subject: [PATCH 09/85] Update de.json and small improvements --- assets/translations/de.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index 462f3a4..bf8198f 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -122,15 +122,15 @@ "ascending": "Aufsteigend", "descending": "Absteigend", "bgUpdateCheckInterval": "Prüfintervall für Hintergrundaktualisierung", - "neverManualOnly": "Nie - nur manuell", + "neverManualOnly": "Nie – nur manuell", "appearance": "Aussehen", "showWebInAppView": "Quellwebseite in der App-Ansicht anzeigen", "pinUpdates": "Apps mit Aktualisierungen oben anheften", "updates": "Aktualisierungen", "sourceSpecific": "Quellenspezifisch", "appSource": "App-Quelle", - "noLogs": "Keine Protokolle", - "appLogs": "App Protokolle", + "noLogs": "Keine Logs", + "appLogs": "App-Logs", "close": "Schließen", "share": "Teilen", "appNotFound": "App nicht gefunden", @@ -256,25 +256,25 @@ "filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern", "trySelectingSuggestedVersionCode": "Versuchen, die vorgeschlagene APK-Code-Version auszuwählen", "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "reverseSort": "Umgekehrtes Sortieren", + "debugMenu": "Debug Menü", + "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", + "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" }, "tooManyRequestsTryAgainInMinutes": { - "one": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minute erneut", - "other": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minuten erneut" + "one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut", + "other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minuten erneut" }, "bgUpdateGotErrorRetryInMinutes": { "one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant", "other": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minuten geplant" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "Hintergrundaktualisierungsprüfung fand {} Aktualisierung - benachrichtigt den Benutzer, falls erforderlich", - "other": "Hintergrundaktualisierungsprüfung fand {} Aktualisierungen - benachrichtigt den Benutzer, falls erforderlich" + "one": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierung – benachrichtigt den Benutzer, falls erforderlich", + "other": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt den Benutzer, falls erforderlich" }, "apps": { "one": "{} App", @@ -297,8 +297,8 @@ "other": "{} Tage" }, "clearedNLogsBeforeXAfterY": { - "one": "{n} Protokoll gelöscht (vorher = {vorher}, nachher = {nachher})", - "other": "{n} Protokolle gelöscht (vorher = {vorher}, nachher = {nachher})" + "one": "{n} Log gelöscht (vorher = {vorher}, nachher = {nachher})", + "other": "{n} Logs gelöscht (vorher = {vorher}, nachher = {nachher})" }, "xAndNMoreUpdatesAvailable": { "one": "{} und 1 weitere App haben Aktualisierungen.", From 7bfc5ae0a85fdf9dac8562d4530e814435b5a9a4 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Tue, 3 Oct 2023 21:34:24 -0400 Subject: [PATCH 10/85] Bugfix (#954) --- lib/app_sources/html.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 60fc32d..4cb9b26 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -120,14 +120,14 @@ class HTML extends AppSource { GeneratedFormTextField('matchGroupToUse', label: tr('matchGroupToUse'), required: false, - hint: '1', + hint: '0', textInputType: const TextInputType.numberWithOptions(), additionalValidators: [ (value) { if (value?.isEmpty == true) { value = null; } - value ??= '1'; + value ??= '0'; return intValidator(value); } ]) @@ -216,8 +216,12 @@ class HTML extends AppSource { if (match.isEmpty) { throw NoVersionError(); } - version = match.last - .group(int.parse(additionalSettings['matchGroupToUse'] as String)); + String matchGroupString = + (additionalSettings['matchGroupToUse'] as String).trim(); + if (matchGroupString.isEmpty) { + matchGroupString = "0"; + } + version = match.last.group(int.parse(matchGroupString)); if (version?.isEmpty == true) { throw NoVersionError(); } From 8bd0d185aeb1aa1edf1e8d4697d769a9f49df2de Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Thu, 5 Oct 2023 11:16:42 +0100 Subject: [PATCH 11/85] Create android.yml --- .github/workflows/android.yml | 76 +++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 .github/workflows/android.yml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 0000000..3f81740 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,76 @@ +name: android + +on: + workflow_dispatch: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + + - uses: actions/checkout@v3 + + - uses: subosito/flutter-action@v2 + + - name: Build APKs + run: | + sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle + flutter build apk && flutter build apk --split-per-abi + + - name: Sign APKs + env: + KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} + KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} + run: | + echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore + for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do + out=${apk/-release/-release-signed} + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass env:KEYSTORE_PASS --out "${out}" "${apk}" + echo "$(sha256sum ${out})" + done + rm apksign.keystore + + - name: Create Release And Upload APKs + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.GAT }} + tag: "v${{ steps.compare_versions.outputs.version }}-beta" + artifacts: ./build/app/outputs/flutter-apk/*-signed*.apk + continue-on-error: true + + - name: Wait For 10 Seconds + run: sleep 10 + + - name: Verify If APKs Have Been Uploaded + id: check_for_apk + run: | + release_info=$(curl -s "https://api.github.com/repos/ImranR98/Obtainium/releases/latest" -H "Authorization: Bearer ${{ secrets.GAT }}") + apk_asset_count=$(echo $release_info | jq '.assets | length') + release_id=$(echo $release_info | jq -r '.id') + if [[ $apk_asset_count -eq 0 ]]; then + echo "Deleting the release $release_id" + echo "::set-output name=delete_latest_release::true" + else + echo "APK found. Not deleting the release $release_id" + echo "::set-output name=delete_latest_release::false" + fi + + - name: Delete The Latest Release If No APKs Found + uses: ClementTsang/delete-tag-and-release@v0.3.1 + with: + delete_release: true + tag_name: "v${{ steps.compare_versions.outputs.version }}-beta" + env: + GITHUB_TOKEN: ${{ secrets.GAT }} + if: steps.check_for_apk.outputs.delete_latest_release == 'true' + + - name: Archive Reports For Job + uses: actions/upload-artifact@v3 + with: + name: reports + path: '*/build/reports' + if: ${{ always() }} From 102b9da617c80ff9aaf2713ac5edf41e6c0b556a Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Thu, 5 Oct 2023 11:19:46 +0100 Subject: [PATCH 12/85] Update android.yml --- .github/workflows/android.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 3f81740..608c64a 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -34,11 +34,17 @@ jobs: done rm apksign.keystore + - name: Extract Version + id: extract_version + run: | + VERSION=$(grep -oP "currentVersion = '\K[^']+" lib/main.dart) + echo "::set-output name=version::$VERSION" + - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 with: token: ${{ secrets.GAT }} - tag: "v${{ steps.compare_versions.outputs.version }}-beta" + tag: "v${{ steps.extract_version.outputs.version }}-beta" artifacts: ./build/app/outputs/flutter-apk/*-signed*.apk continue-on-error: true From 6935bff244d98876f46c919b9bacb0e2b48b7b37 Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Thu, 5 Oct 2023 11:22:29 +0100 Subject: [PATCH 13/85] Update android.yml --- .github/workflows/android.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 608c64a..5ad5a55 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -45,6 +45,7 @@ jobs: with: token: ${{ secrets.GAT }} tag: "v${{ steps.extract_version.outputs.version }}-beta" + prerelease: true artifacts: ./build/app/outputs/flutter-apk/*-signed*.apk continue-on-error: true From ae0cd74b0e59bebeb2f4e54fc4ab6c44e14fd651 Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Thu, 5 Oct 2023 11:29:03 +0100 Subject: [PATCH 14/85] Update android.yml --- .github/workflows/android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 5ad5a55..b494ac7 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -70,7 +70,7 @@ jobs: uses: ClementTsang/delete-tag-and-release@v0.3.1 with: delete_release: true - tag_name: "v${{ steps.compare_versions.outputs.version }}-beta" + tag_name: "v${{ steps.extract_version.outputs.version }}-beta" env: GITHUB_TOKEN: ${{ secrets.GAT }} if: steps.check_for_apk.outputs.delete_latest_release == 'true' From 4304251e1e1b0ac66ffcd0c7e0e1bcd9c6d87924 Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Thu, 5 Oct 2023 11:31:42 +0100 Subject: [PATCH 15/85] Remove checking for APKs This is because I couldn't check for prereleases because I don't know how, maybe you can. --- .github/workflows/android.yml | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index b494ac7..9ccee7f 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -47,34 +47,7 @@ jobs: tag: "v${{ steps.extract_version.outputs.version }}-beta" prerelease: true artifacts: ./build/app/outputs/flutter-apk/*-signed*.apk - continue-on-error: true - - - name: Wait For 10 Seconds - run: sleep 10 - - - name: Verify If APKs Have Been Uploaded - id: check_for_apk - run: | - release_info=$(curl -s "https://api.github.com/repos/ImranR98/Obtainium/releases/latest" -H "Authorization: Bearer ${{ secrets.GAT }}") - apk_asset_count=$(echo $release_info | jq '.assets | length') - release_id=$(echo $release_info | jq -r '.id') - if [[ $apk_asset_count -eq 0 ]]; then - echo "Deleting the release $release_id" - echo "::set-output name=delete_latest_release::true" - else - echo "APK found. Not deleting the release $release_id" - echo "::set-output name=delete_latest_release::false" - fi - - - name: Delete The Latest Release If No APKs Found - uses: ClementTsang/delete-tag-and-release@v0.3.1 - with: - delete_release: true - tag_name: "v${{ steps.extract_version.outputs.version }}-beta" - env: - GITHUB_TOKEN: ${{ secrets.GAT }} - if: steps.check_for_apk.outputs.delete_latest_release == 'true' - + - name: Archive Reports For Job uses: actions/upload-artifact@v3 with: From 21fdfc1eef72462e4a9fe4ada9869de0f87dcca7 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 19:23:18 -0400 Subject: [PATCH 16/85] Attempting to parallelize update checks --- lib/custom_errors.dart | 5 +- lib/pages/apps.dart | 2 +- lib/providers/apps_provider.dart | 194 ++++++++++++++++++------------- 3 files changed, 115 insertions(+), 86 deletions(-) diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 6343c87..4d807c5 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -65,11 +65,14 @@ class NotImplementedError extends ObtainiumError { } class MultiAppMultiError extends ObtainiumError { + Map rawErrors = {}; Map> content = {}; MultiAppMultiError() : super(tr('placeholder'), unexpected: true); - add(String appId, String string) { + add(String appId, dynamic error) { + rawErrors[appId] = error; + var string = error.toString(); var tempIds = content.remove(string); tempIds ??= []; tempIds.add(appId); diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 3f4cc30..cb7ce46 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -68,7 +68,7 @@ class AppsPageState extends State { refreshingSince = DateTime.now(); }); return appsProvider.checkUpdates().catchError((e) { - showError(e, context); + showError(e is Map ? e['errors'] : e, context); return []; }).whenComplete(() { setState(() { diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 2dc7498..1a9e052 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -449,7 +449,7 @@ class AppsProvider with ChangeNotifier { } catch (e) { logs.add( 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); - errors.add(dir.appId, e.toString()); + errors.add(dir.appId, e); } } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); @@ -677,7 +677,7 @@ class AppsProvider with ChangeNotifier { } installedIds.add(id); } catch (e) { - errors.add(id, e.toString()); + errors.add(id, e); } } @@ -1069,7 +1069,8 @@ class AppsProvider with ChangeNotifier { Future> checkUpdates( {DateTime? ignoreAppsCheckedAfter, - bool throwErrorsForRetry = false}) async { + bool throwErrorsForRetry = false, + List? specificIds}) async { List updates = []; MultiAppMultiError errors = MultiAppMultiError(); if (!gettingUpdates) { @@ -1077,27 +1078,33 @@ class AppsProvider with ChangeNotifier { try { List appIds = getAppsSortedByUpdateCheckTime( ignoreAppsCheckedAfter: ignoreAppsCheckedAfter); - for (int i = 0; i < appIds.length; i++) { + if (specificIds != null) { + appIds = appIds.where((aId) => specificIds.contains(aId)).toList(); + } + await Future.wait(appIds.map((appId) async { App? newApp; try { - newApp = await checkUpdate(appIds[i]); + newApp = await checkUpdate(appId); } catch (e) { if ((e is RateLimitError || e is SocketException) && throwErrorsForRetry) { rethrow; } - errors.add(appIds[i], e.toString()); + errors.add(appId, e); } if (newApp != null) { updates.add(newApp); } - } + }), eagerError: true); } finally { gettingUpdates = false; } } if (errors.content.isNotEmpty) { - throw errors; + var res = Map(); + res['errors'] = errors; + res['updates'] = updates; + throw res; } return updates; } @@ -1314,18 +1321,16 @@ class _APKOriginWarningDialogState extends State { /// Background updater function /// -/// @param List? toCheck: The appIds to check for updates (default to all apps sorted by last update check time) +/// @param List>? toCheck: The appIds to check for updates (with the number of previous attempts made per appid) (defaults to all apps) /// /// @param List? toInstall: The appIds to attempt to update (defaults to an empty array) /// -/// @param int? attemptCount: The number of times the function has failed up to this point (defaults to 0) -/// /// When toCheck is empty, the function is in "install mode" (else it is in "update mode"). /// In update mode, all apps in toCheck are checked for updates. /// If an update is available, the appId is either added to toInstall (if a background update is possible) or the user is notified. -/// If there is an error, the function tries to continue after a few minutes (duration depends on the error), up to a maximum of 5 tries. +/// If there are errors, the task is run again for the remaining apps after a few minutes (duration depends on the errors), up to a maximum of 5 tries for any app. /// -/// Once all update checks are complete, the function is called again in install mode. +/// Once all update checks are complete, the task is run again in install mode. /// In this mode, all apps in toInstall are downloaded and installed in the background (install result is unknown). /// If there is an error, the function tries to continue after a few minutes (duration depends on the error), up to a maximum of 5 tries. /// @@ -1372,87 +1377,105 @@ Future bgUpdateCheck(int taskId, Map? params) async { 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); if (!installMode) { - // If in update mode... - var didCompleteChecking = false; - CheckingUpdatesNotification? notif; + // If in update mode, we check for updates. + // We divide the results into 4 groups: + // - toNotify - Apps with updates that the user will be notified about (can't be silently installed) + // - toRetry - Apps with update check errors that will be retried in a while + // - toThrow - Apps with update check errors that the user will be notified about (no retry) + // - toInstall - Apps with updates that will be installed silently + // After grouping the updates, we take care of toNotify and toThrow first + // Then if toRetry is not empty, we schedule another update task to run in a while (toInstall is retained) + // If toRetry is empty, we take care of toInstall + + // Init. vars. + List updates = []; + List toNotify = []; + List> toRetry = []; + var retryAfterXSeconds = 0; + List> toThrow = []; var networkRestricted = false; if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { var netResult = await (Connectivity().checkConnectivity()); networkRestricted = (netResult != ConnectivityResult.wifi) && (netResult != ConnectivityResult.ethernet); } - // Loop through all updates and check each - List toNotify = []; + CheckingUpdatesNotification notif = + CheckingUpdatesNotification(plural('app', toCheck.length)); + try { - for (int i = 0; i < toCheck.length; i++) { - var appId = toCheck[i].key; - var attemptCount = toCheck[i].value + 1; - AppInMemory? app = appsProvider.apps[appId]; - if (app?.app.installedVersion != null) { - try { - notificationsProvider.notify( - notif = CheckingUpdatesNotification(app?.name ?? appId), - cancelExisting: true); - App? newApp = await appsProvider.checkUpdate(appId); - if (newApp != null) { - if (networkRestricted || - !(await appsProvider.canInstallSilently(app!.app))) { - toNotify.add(newApp); - } else { - toInstall.add(MapEntry(appId, 0)); - } - } - if (i == (toCheck.length - 1)) { - didCompleteChecking = true; - } - } catch (e) { - // If you got an error, move the offender to the back of the line (increment their fail count) and schedule another task to continue checking shortly - logs.add( - 'BG update task $taskId: Got error on checking for $appId \'${e.toString()}\'.'); - if (attemptCount < maxAttempts) { - var remainingSeconds = e is RateLimitError - ? (i == 0 ? (e.remainingMinutes * 60) : (5 * 60)) - : e is ClientException - ? (15 * 60) - : pow(attemptCount, 2).toInt(); - logs.add( - 'BG update task $taskId: Will continue in $remainingSeconds seconds (with $appId moved to the end of the line).'); - var remainingToCheck = moveStrToEndMapEntryWithCount( - toCheck.sublist(i), MapEntry(appId, attemptCount)); - AndroidAlarmManager.oneShot(Duration(seconds: remainingSeconds), - taskId + 1, bgUpdateCheck, - params: { - 'toCheck': remainingToCheck - .map( - (entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - 'toInstall': toInstall - .map( - (entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - }); - break; - } else { - // If the offender has reached its fail limit, notify the user and remove it from the list (task can continue) - toCheck.removeAt(i); - i--; - notificationsProvider - .notify(ErrorCheckingUpdatesNotification(e.toString())); - } - } finally { - if (notif != null) { - notificationsProvider.cancel(notif.id); + // Check for updates + notificationsProvider.notify(notif, cancelExisting: true); + updates = await appsProvider.checkUpdates( + specificIds: toCheck.map((e) => e.key).toList()); + } catch (e) { + // If there were errors, group them into toRetry and toThrow + if (e is Map) { + updates = e['updates']; + MultiAppMultiError errors = e['errors']; + errors.rawErrors.forEach((key, err) { + logs.add( + 'BG update task $taskId: Got error on checking for $key \'${err.toString()}\'.'); + var toCheckApp = toCheck.where((element) => element.key == key).first; + if (toCheckApp.value < maxAttempts) { + toRetry.add(MapEntry(toCheckApp.key, toCheckApp.value + 1)); + var minRetryIntervalForThisApp = err is RateLimitError + ? (err.remainingMinutes * 60) + : e is ClientException + ? (15 * 60) + : pow(toCheckApp.value, 2).toInt(); + if (minRetryIntervalForThisApp > retryAfterXSeconds) { + retryAfterXSeconds = minRetryIntervalForThisApp; } + } else { + toThrow.add(MapEntry(key, err)); } - } + }); + } else { + // We don't expect to ever get here in any situation so no need to catch + logs.add('Fatal error in BG update task: ${e.toString()}'); + rethrow; } } finally { - if (toNotify.isNotEmpty) { - notificationsProvider.notify(UpdateNotification(toNotify)); + notificationsProvider.cancel(notif.id); + } + + // Group the updates into toNotify and toInstall + for (var i = 0; i < updates.length; i++) { + if (networkRestricted || + !(await appsProvider.canInstallSilently(updates[i]))) { + toNotify.add(updates[i]); + } else { + toInstall.add(MapEntry(updates[i].id, 0)); } } - // If you're done checking and found some silently installable updates, schedule another task which will run in install mode - if (didCompleteChecking && toInstall.isNotEmpty) { + + // Send the update notification + if (toNotify.isNotEmpty) { + notificationsProvider.notify(UpdateNotification(toNotify)); + } + + // Send the error notifications + if (toThrow.isNotEmpty) { + for (var element in toThrow) { + notificationsProvider.notify(ErrorCheckingUpdatesNotification( + '${element.key}: ${element.value.toString()}')); + } + } + + // if there are update checks to retry, schedule a retry task + if (toRetry.isNotEmpty) { + logs.add( + 'BG update task $taskId: Will retry in $retryAfterXSeconds seconds.'); + AndroidAlarmManager.oneShot( + Duration(seconds: retryAfterXSeconds), taskId + 1, bgUpdateCheck, + params: { + 'toCheck': toRetry, + 'toInstall': toInstall + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + }); + } else if (toInstall.isNotEmpty) { + // If there are no more update checks, schedule an install task logs.add( 'BG update task $taskId: Done. Scheduling install task to run immediately.'); AndroidAlarmManager.oneShot( @@ -1463,11 +1486,14 @@ Future bgUpdateCheck(int taskId, Map? params) async { .map((entry) => {'key': entry.key, 'value': entry.value}) .toList() }); - } else if (didCompleteChecking) { + } else { logs.add('BG install task $taskId: Done.'); } - } else { - // If in install mode... + } + + if (installMode) { + // If in install mode, we install silent updates. + var didCompleteInstalling = false; var tempObtArr = toInstall.where((element) => element.key == obtainiumId); if (tempObtArr.isNotEmpty) { From e9e9adb1744eeaff9d5cf3a1ccf6c668378287e2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 19:34:08 -0400 Subject: [PATCH 17/85] Tweaks --- lib/providers/apps_provider.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 1a9e052..31824c2 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1458,7 +1458,8 @@ Future bgUpdateCheck(int taskId, Map? params) async { if (toThrow.isNotEmpty) { for (var element in toThrow) { notificationsProvider.notify(ErrorCheckingUpdatesNotification( - '${element.key}: ${element.value.toString()}')); + '${element.key}: ${element.value.toString()}', + id: Random().nextInt(10000))); } } @@ -1469,7 +1470,9 @@ Future bgUpdateCheck(int taskId, Map? params) async { AndroidAlarmManager.oneShot( Duration(seconds: retryAfterXSeconds), taskId + 1, bgUpdateCheck, params: { - 'toCheck': toRetry, + 'toCheck': toRetry + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), 'toInstall': toInstall .map((entry) => {'key': entry.key, 'value': entry.value}) .toList(), From 8163cd5c8f7ab9706d4711d64e553007b82e73a2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 19:58:46 -0400 Subject: [PATCH 18/85] Improvements, bugfixes --- lib/custom_errors.dart | 24 +++++++++++++----------- lib/pages/apps.dart | 2 +- lib/pages/import_export.dart | 5 +++-- lib/providers/apps_provider.dart | 29 +++++++++++++++-------------- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 4d807c5..04e6104 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -66,27 +66,29 @@ class NotImplementedError extends ObtainiumError { class MultiAppMultiError extends ObtainiumError { Map rawErrors = {}; - Map> content = {}; + Map> idsByErrorString = {}; + Map appIdNames = {}; MultiAppMultiError() : super(tr('placeholder'), unexpected: true); - add(String appId, dynamic error) { + add(String appId, dynamic error, {String? appName}) { rawErrors[appId] = error; var string = error.toString(); - var tempIds = content.remove(string); + var tempIds = idsByErrorString.remove(string); tempIds ??= []; tempIds.add(appId); - content.putIfAbsent(string, () => tempIds!); + idsByErrorString.putIfAbsent(string, () => tempIds!); + if (appName != null) { + appIdNames[appId] = appName; + } } + String errorString(String appId) => + '${appIdNames.containsKey(appId) ? '${appIdNames[appId]} ($appId)' : appId}: ${rawErrors[appId].toString()}'; + @override - String toString() { - String finalString = ''; - for (var e in content.keys) { - finalString += '$e: ${content[e].toString()}\n\n'; - } - return finalString; - } + String toString() => + idsByErrorString.keys.map((e) => errorString(e)).join('\n\n'); } showError(dynamic e, BuildContext context) { diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index cb7ce46..fe98aa9 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -833,7 +833,7 @@ class AppsPageState extends State { items: const [], initValid: true, message: tr('installStatusOfXWillBeResetExplanation', - args: [plural('app', selectedAppIds.length)]), + args: [plural('apps', selectedAppIds.length)]), ); }); if (values != null) { diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 264f3a9..68de7f5 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -217,7 +217,8 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', + args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously @@ -274,7 +275,7 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 31824c2..7c150c6 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -449,7 +449,7 @@ class AppsProvider with ChangeNotifier { } catch (e) { logs.add( 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); - errors.add(dir.appId, e); + errors.add(dir.appId, e, appName: apps[dir.appId]?.name); } } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); @@ -457,7 +457,7 @@ class AppsProvider with ChangeNotifier { } if (somethingInstalled) { dir.file.delete(recursive: true); - } else if (errors.content.isNotEmpty) { + } else if (errors.idsByErrorString.isNotEmpty) { throw errors; } } finally { @@ -677,11 +677,11 @@ class AppsProvider with ChangeNotifier { } installedIds.add(id); } catch (e) { - errors.add(id, e); + errors.add(id, e, appName: apps[id]?.name); } } - if (errors.content.isNotEmpty) { + if (errors.idsByErrorString.isNotEmpty) { throw errors; } @@ -1090,7 +1090,7 @@ class AppsProvider with ChangeNotifier { throwErrorsForRetry) { rethrow; } - errors.add(appId, e); + errors.add(appId, e, appName: apps[appId]?.name); } if (newApp != null) { updates.add(newApp); @@ -1100,7 +1100,7 @@ class AppsProvider with ChangeNotifier { gettingUpdates = false; } } - if (errors.content.isNotEmpty) { + if (errors.idsByErrorString.isNotEmpty) { var res = Map(); res['errors'] = errors; res['updates'] = updates; @@ -1392,15 +1392,16 @@ Future bgUpdateCheck(int taskId, Map? params) async { List toNotify = []; List> toRetry = []; var retryAfterXSeconds = 0; - List> toThrow = []; + List toThrow = []; var networkRestricted = false; if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { var netResult = await (Connectivity().checkConnectivity()); networkRestricted = (netResult != ConnectivityResult.wifi) && (netResult != ConnectivityResult.ethernet); } + MultiAppMultiError? errors; CheckingUpdatesNotification notif = - CheckingUpdatesNotification(plural('app', toCheck.length)); + CheckingUpdatesNotification(plural('apps', toCheck.length)); try { // Check for updates @@ -1411,8 +1412,8 @@ Future bgUpdateCheck(int taskId, Map? params) async { // If there were errors, group them into toRetry and toThrow if (e is Map) { updates = e['updates']; - MultiAppMultiError errors = e['errors']; - errors.rawErrors.forEach((key, err) { + errors = e['errors']; + errors!.rawErrors.forEach((key, err) { logs.add( 'BG update task $taskId: Got error on checking for $key \'${err.toString()}\'.'); var toCheckApp = toCheck.where((element) => element.key == key).first; @@ -1422,12 +1423,12 @@ Future bgUpdateCheck(int taskId, Map? params) async { ? (err.remainingMinutes * 60) : e is ClientException ? (15 * 60) - : pow(toCheckApp.value, 2).toInt(); + : pow(toCheckApp.value + 1, 2).toInt(); if (minRetryIntervalForThisApp > retryAfterXSeconds) { retryAfterXSeconds = minRetryIntervalForThisApp; } } else { - toThrow.add(MapEntry(key, err)); + toThrow.add(key); } }); } else { @@ -1456,9 +1457,9 @@ Future bgUpdateCheck(int taskId, Map? params) async { // Send the error notifications if (toThrow.isNotEmpty) { - for (var element in toThrow) { + for (var appId in toThrow) { notificationsProvider.notify(ErrorCheckingUpdatesNotification( - '${element.key}: ${element.value.toString()}', + errors!.errorString(appId), id: Random().nextInt(10000))); } } From df93cbde8f7aef0ce4b72e437a1bfb819da7662b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 20:37:14 -0400 Subject: [PATCH 19/85] Fix UpToDown (#962) --- lib/app_sources/uptodown.dart | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index 7b36cc3..86b640c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -80,4 +80,20 @@ class Uptodown extends AppSource { version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName), releaseDate: relDate); } + + @override + Future apkUrlPrefetchModifier( + String apkUrl, String standardUrl) async { + var res = await sourceRequest(apkUrl); + if (res.statusCode != 200) { + throw getObtainiumHttpError(res); + } + var html = parse(res.body); + var finalUrl = + (html.querySelector('.post-download')?.attributes['data-url']); + if (finalUrl == null) { + throw NoAPKError(); + } + return finalUrl; + } } From f34ffe18a8db70b56cc3e753cda36b9a6c7b9240 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 20:42:09 -0400 Subject: [PATCH 20/85] Update packages, increment version --- lib/main.dart | 2 +- pubspec.lock | 24 ++++++++++++------------ pubspec.yaml | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 1f2815e..d3343ea 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.22'; +const String currentVersion = '0.14.23'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.lock b/pubspec.lock index 51a04bc..fe8eaa3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -46,10 +46,10 @@ packages: dependency: transitive description: name: archive - sha256: d4dc11707abb32ef756ab95678c0d6df54003d98277f7c9aeda14c48e7a38c2f + sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" url: "https://pub.dev" source: hosted - version: "3.4.3" + version: "3.4.4" args: dependency: transitive description: @@ -291,10 +291,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + sha256: "6d11ea777496061e583623aaf31923f93a9409ef8fcaeeefdd6cd78bf4fe5bb3" url: "https://pub.dev" source: hosted - version: "15.1.1" + version: "16.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -320,10 +320,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: a10979814c5f4ddbe2b6143fba25d927599e21e3ba65b3862995960606fae78f + sha256: "8afc9a6aa6d8e8063523192ba837149dbf3d377a37c0b0fc579149a1fbd4a619" url: "https://pub.dev" source: hosted - version: "0.6.17+3" + version: "0.6.18" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -538,10 +538,10 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: ad65ba9af42a3d067203641de3fd9f547ded1410bad3b84400c2b4899faede70 + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.0.1" permission_handler_android: dependency: transitive description: @@ -879,10 +879,10 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "053d454c9475546b4382e9498601fb46293cdac9b3ca93f1a738375bc9a1eee4" + sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.1" webview_flutter_android: dependency: transitive description: @@ -903,10 +903,10 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "3c7d56ca4b82654ad1f58aeefb8d593a59224f26d6b2bf8feed074361eb34c86" + sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.9.1" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index af466c0..5c82b0f 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: 0.14.22+214 # When changing this, update the tag in main() accordingly +version: 0.14.23+215 # 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: ^15.1.0+1 + flutter_local_notifications: ^16.1.0 provider: ^6.0.3 http: ^1.0.0 webview_flutter: ^4.0.0 From 33caf4644e82040a1dd910bc9ce50c741f8df946 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 20:43:06 -0400 Subject: [PATCH 21/85] Ran dart fix --- lib/providers/apps_provider.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 7c150c6..9acd085 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -738,7 +738,6 @@ class AppsProvider with ChangeNotifier { var naiveStandardVersionDetection = SourceProvider() .getSource(app.url, overrideSource: app.overrideSource) .naiveStandardVersionDetection; - ; // FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL if (installedInfo == null && app.installedVersion != null && !trackOnly) { // App says it's installed but isn't really (and isn't track only) - set to not installed @@ -1101,7 +1100,7 @@ class AppsProvider with ChangeNotifier { } } if (errors.idsByErrorString.isNotEmpty) { - var res = Map(); + var res = {}; res['errors'] = errors; res['updates'] = updates; throw res; From 4e5a9b2af5099f70f21f6b1e26134e05df28a48d Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 21:19:46 -0400 Subject: [PATCH 22/85] Updated GitHub actions --- .../workflows/{android.yml => release.yml} | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) rename .github/workflows/{android.yml => release.yml} (59%) diff --git a/.github/workflows/android.yml b/.github/workflows/release.yml similarity index 59% rename from .github/workflows/android.yml rename to .github/workflows/release.yml index 9ccee7f..ed76aa5 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: android +name: Release (Manual/Draft) on: workflow_dispatch: @@ -25,12 +25,16 @@ jobs: env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} + GPG_KEY: ${{ secrets.GPG_KEY }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore + echo "$GPG_KEY" | gpg --import for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do - out=${apk/-release/-release-signed} - ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass env:KEYSTORE_PASS --out "${out}" "${apk}" - echo "$(sha256sum ${out})" + unsignedFn=${apk/-release/-unsigned} + mv "$apk" "$unsignedFn" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass env:KEYSTORE_PASS --out "${apk}" "${unsignedFn}" + sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 + gpg --sign --detach-sig "$apk".sha256 done rm apksign.keystore @@ -39,14 +43,19 @@ jobs: run: | VERSION=$(grep -oP "currentVersion = '\K[^']+" lib/main.dart) echo "::set-output name=version::$VERSION" + TAG=$(grep -oP "'.*\\\$currentVersion.*'" lib/main.dart | head -c -2 | tail -c +2 | sed "s/\$currentVersion/$VERSION/g") + echo "::set-output name=tag::$TAG" + if [ -n "$(echo $TAG | grep -oP '\-beta$')" ]; then BETA=true; else BETA=false; fi + echo "::set-output name=beta::$BETA" - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 with: token: ${{ secrets.GAT }} - tag: "v${{ steps.extract_version.outputs.version }}-beta" - prerelease: true - artifacts: ./build/app/outputs/flutter-apk/*-signed*.apk + tag: "${{ steps.extract_version.outputs.tag }}" + prerelease: "${{ steps.extract_version.outputs.beta }}" + artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* + draft: true - name: Archive Reports For Job uses: actions/upload-artifact@v3 From ba1db88c8d4257c901a575d1911b99902a58f9db Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Fri, 6 Oct 2023 21:21:26 -0400 Subject: [PATCH 23/85] Run GH action manually only --- .github/workflows/release.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ed76aa5..ead8289 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,9 +2,6 @@ name: Release (Manual/Draft) on: workflow_dispatch: - push: - branches: - - main jobs: build: From 8f25245ad1efe774c42048ed898b86e133e6cd32 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 21:47:25 -0400 Subject: [PATCH 24/85] 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 ead8289..216740c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,10 +22,10 @@ jobs: env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} - GPG_KEY: ${{ secrets.GPG_KEY }} + GPG_KEY: ${{ secrets.PGP_KEY_BASE64 }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore - echo "$GPG_KEY" | gpg --import + echo "$GPG_KEY" | base64 -d | gpg --import for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" From 65187cb17bec81d3be7b096cb9b7af5b56bc7444 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:04:55 -0400 Subject: [PATCH 25/85] Update release.yml --- .github/workflows/release.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 216740c..a438fb5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,16 @@ jobs: - uses: subosito/flutter-action@v2 + - name: Temp + env: + PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} + PGP_KEY_PASSPHRASE: ${{ secrets.PGP_KEY_PASSPHRASE }} + run: | + echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" + PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" + gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" + gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" + - name: Build APKs run: | sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle @@ -22,10 +32,12 @@ jobs: env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} - GPG_KEY: ${{ secrets.PGP_KEY_BASE64 }} + PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} + PGP_KEY_PASSPHRASE: ${{ secrets.PGP_KEY_PASSPHRASE }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore - echo "$GPG_KEY" | base64 -d | gpg --import + echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" + PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" @@ -34,6 +46,8 @@ jobs: gpg --sign --detach-sig "$apk".sha256 done rm apksign.keystore + gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" + gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" - name: Extract Version id: extract_version @@ -48,7 +62,7 @@ jobs: - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 with: - token: ${{ secrets.GAT }} + token: ${{ secrets.GITHUB_ACCESS_TOKEN }} tag: "${{ steps.extract_version.outputs.tag }}" prerelease: "${{ steps.extract_version.outputs.beta }}" artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* From ce259764a885fea6c52a51f41ed312fa9a51c4fc Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:09:33 -0400 Subject: [PATCH 26/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a438fb5..faafc38 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,9 +16,9 @@ jobs: - name: Temp env: PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} - PGP_KEY_PASSPHRASE: ${{ secrets.PGP_KEY_PASSPHRASE }} run: | echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" + echo A PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From ef40f3900fecb12a10f7f5d628927d706c292109 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:11:25 -0400 Subject: [PATCH 27/85] Update release.yml --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index faafc38..67a996d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,7 @@ jobs: env: PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} run: | + export GPG_TTY=$(tty) echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" echo A PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" From 66446cbffc3a9258d0c4a1dfed409b7d8de6b0a0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:16:41 -0400 Subject: [PATCH 28/85] Update release.yml --- .github/workflows/release.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 67a996d..c83aeb3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,14 +13,17 @@ jobs: - uses: subosito/flutter-action@v2 + - name: Import GPG key + id: import_pgp_key + uses: crazy-max/ghaction-import-gpg@v6 + with: + gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} + - name: Temp env: PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} run: | - export GPG_TTY=$(tty) - echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" - echo A - PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" + PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.tag }}" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 01385991200723e07c13caea7c4bd8ee624e5839 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:23:45 -0400 Subject: [PATCH 29/85] Update release.yml --- .github/workflows/release.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c83aeb3..dfa2716 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,10 +20,9 @@ jobs: gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} - name: Temp - env: - PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} run: | - PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.tag }}" + echo -n "Hello, World!" | gpg --clearsign + PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" @@ -36,12 +35,8 @@ jobs: env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} - PGP_KEY_BASE64: ${{ secrets.PGP_KEY_BASE64 }} - PGP_KEY_PASSPHRASE: ${{ secrets.PGP_KEY_PASSPHRASE }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore - echo "$PGP_KEY_BASE64" | base64 -d | gpg --import --passphrase "$PGP_KEY_PASSPHRASE" - PGP_KEY_FINGERPRINT="$(gpg --list-keys --with-colon "$(echo "$PGP_KEY_BASE64" | base64 -d | gpg --with-fingerprint --list-packets | grep 'user ID' | awk -F'"' '{print $2}')" | awk -F: '/^pub:/ { print $5 }')" for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" @@ -50,6 +45,7 @@ jobs: gpg --sign --detach-sig "$apk".sha256 done rm apksign.keystore + PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From df7b74e727b09d2980ad9c9175d0327fcdb9e06e Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:28:02 -0400 Subject: [PATCH 30/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfa2716..9b56fd0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: - name: Temp run: | - echo -n "Hello, World!" | gpg --clearsign + echo -n "Hello, World!" | gpg --batch --pinentry-mode loopback --clearsign PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 3d5411ef28fe423dce8d2b8d6f437f483cd2bfd8 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:32:23 -0400 Subject: [PATCH 31/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b56fd0..9401d94 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,8 +21,8 @@ jobs: - name: Temp run: | - echo -n "Hello, World!" | gpg --batch --pinentry-mode loopback --clearsign PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" + echo -n "Hello, World!" | gpg --batch --clearsign --local-user "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 36a8b04c4f0788fd7459b04728809f5833b804e6 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:35:40 -0400 Subject: [PATCH 32/85] Update release.yml --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9401d94..056cb75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,8 @@ jobs: - name: Temp run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - echo -n "Hello, World!" | gpg --batch --clearsign --local-user "$PGP_KEY_FINGERPRINT" + export GPG_TTY=$(tty) + echo -n "Hello, World!" | gpg --batch --clearsign --pinentry-mode loopback --passphrase "" --local-user "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 035df1f33841eb095433d991e8d462ccdb045356 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:38:01 -0400 Subject: [PATCH 33/85] Update release.yml --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 056cb75..70eb0d1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,8 @@ jobs: run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" export GPG_TTY=$(tty) - echo -n "Hello, World!" | gpg --batch --clearsign --pinentry-mode loopback --passphrase "" --local-user "$PGP_KEY_FINGERPRINT" + echo abc > abc + gpg --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 5735293efb8386814b5c5bd7ea6daf824ca27725 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:40:27 -0400 Subject: [PATCH 34/85] 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 70eb0d1..c57175b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,8 +22,8 @@ jobs: - name: Temp run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - export GPG_TTY=$(tty) - echo abc > abc + # export GPG_TTY=$(tty) + echo 'abc' > ./abc gpg --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 95cb8ca4935e9e3ef82d692d82b73f811fa0ac96 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:41:47 -0400 Subject: [PATCH 35/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c57175b..127e952 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: - name: Temp run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - # export GPG_TTY=$(tty) + export GPG_TTY=$(tty) echo 'abc' > ./abc gpg --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" From e95230859efe381340bebf93bc7744d5fe8866e0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:43:41 -0400 Subject: [PATCH 36/85] Update release.yml --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 127e952..41b12c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,9 +9,9 @@ jobs: steps: - - uses: actions/checkout@v3 + #- uses: actions/checkout@v3 - - uses: subosito/flutter-action@v2 + #- uses: subosito/flutter-action@v2 - name: Import GPG key id: import_pgp_key @@ -22,9 +22,9 @@ jobs: - name: Temp run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - export GPG_TTY=$(tty) + # export GPG_TTY=$(tty) echo 'abc' > ./abc - gpg --sign --detach-sig ./abc + gpg --batch --sign --detach-sig --pinentry-mode loopback ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 827e2b161cbb1a92c79db36f50132de78cd16329 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:45:20 -0400 Subject: [PATCH 37/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41b12c9..fdcffeb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" # export GPG_TTY=$(tty) echo 'abc' > ./abc - gpg --batch --sign --detach-sig --pinentry-mode loopback ./abc + gpg --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 15a1f1e6e09f2baaac8b2a24de3405387cc1f4c2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:46:11 -0400 Subject: [PATCH 38/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fdcffeb..faddc61 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" # export GPG_TTY=$(tty) echo 'abc' > ./abc - gpg --sign --detach-sig ./abc + gpg --batch --pinentry-mode loopback --passphrase "ABCDFML" --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 30a9e1ee4b360c7215be0f792fd94f6765e18ada Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:48:21 -0400 Subject: [PATCH 39/85] Update release.yml --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index faddc61..3dca8bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,6 +18,7 @@ jobs: uses: crazy-max/ghaction-import-gpg@v6 with: gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} + passphrase: "ABCDFML" - name: Temp run: | From 6c0459c2ae8e9a7a9ae5b18501eae70daf56dd05 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:51:30 -0400 Subject: [PATCH 40/85] Update release.yml --- .github/workflows/release.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3dca8bc..5699983 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,14 +18,16 @@ jobs: uses: crazy-max/ghaction-import-gpg@v6 with: gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} - passphrase: "ABCDFML" + passphrase: ${{ secrets.PGP_PASSPHRASE }} - name: Temp + env: + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} run: | PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" # export GPG_TTY=$(tty) echo 'abc' > ./abc - gpg --batch --pinentry-mode loopback --passphrase "ABCDFML" --sign --detach-sig ./abc + gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig ./abc gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" From 96fb97f4ef5993dc7c64410c9b8a9de2a3aab050 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:53:13 -0400 Subject: [PATCH 41/85] Update release.yml --- .github/workflows/release.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5699983..3dda30e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,17 +20,6 @@ jobs: gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} passphrase: ${{ secrets.PGP_PASSPHRASE }} - - name: Temp - env: - PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} - run: | - PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - # export GPG_TTY=$(tty) - echo 'abc' > ./abc - gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig ./abc - gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" - gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" - - name: Build APKs run: | sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle @@ -40,6 +29,7 @@ jobs: env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do @@ -47,7 +37,7 @@ jobs: mv "$apk" "$unsignedFn" ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass env:KEYSTORE_PASS --out "${apk}" "${unsignedFn}" sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 - gpg --sign --detach-sig "$apk".sha256 + gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done rm apksign.keystore PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" From ddb50940ce3881bd51e3a838636f6f871aea741a Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:55:50 -0400 Subject: [PATCH 42/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3dda30e..dd68aed 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,7 +57,7 @@ jobs: - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 with: - token: ${{ secrets.GITHUB_ACCESS_TOKEN }} + token: ${{ secrets.GH_ACCESS_TOKEN }} tag: "${{ steps.extract_version.outputs.tag }}" prerelease: "${{ steps.extract_version.outputs.beta }}" artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* From 818dc230891920d1a982f40d9e008af0befbabab Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 22:55:59 -0400 Subject: [PATCH 43/85] 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 dd68aed..1e7b6e0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,9 +9,9 @@ jobs: steps: - #- uses: actions/checkout@v3 + - uses: actions/checkout@v3 - #- uses: subosito/flutter-action@v2 + - uses: subosito/flutter-action@v2 - name: Import GPG key id: import_pgp_key From 238d43f9162a5e041e90ccecdacf8bf16139c913 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:18:25 -0400 Subject: [PATCH 44/85] 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 1e7b6e0..6d478be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,14 +28,13 @@ jobs: - name: Sign APKs env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} - KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }} PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" - ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass env:KEYSTORE_PASS --out "${apk}" "${unsignedFn}" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --out "${apk}" "${unsignedFn}" sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done From 5c562a6bdb143d5f274b57ffaa562ccdd486a93e Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:45:00 -0400 Subject: [PATCH 45/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d478be..a85ec7b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,7 +34,7 @@ jobs: for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" - ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --out "${apk}" "${unsignedFn}" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass "" --out "${apk}" "${unsignedFn}" sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done From b38f6d058122e9702659c21be5fea07f8c2464a0 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Fri, 6 Oct 2023 23:58:33 -0400 Subject: [PATCH 46/85] Update release.yml --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a85ec7b..9b1f7cf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,13 +28,14 @@ jobs: - name: Sign APKs env: KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} run: | echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" - ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass "" --out "${apk}" "${unsignedFn}" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass "${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done From b40a4dd243b5bccfe2bd71b65797f35c09310979 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:09:18 -0400 Subject: [PATCH 47/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b1f7cf..b0ca8a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,7 @@ jobs: for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" - ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass "${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done From 290a78acb55113dd578dde2abd4f4a2ed75332e4 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:30:09 -0400 Subject: [PATCH 48/85] Update release.yml --- .github/workflows/release.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0ca8a0..f63320a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,8 +36,9 @@ jobs: unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" - sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 - gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 + ls -l + # sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 + gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha1 done rm apksign.keystore PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" From e314717a3e59e409b27944ce1659662d44a5451d Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:33:50 -0400 Subject: [PATCH 49/85] Update release.yml --- .github/workflows/release.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f63320a..e817961 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release (Manual/Draft) +name: Release (as Draft) on: workflow_dispatch: @@ -10,7 +10,6 @@ jobs: steps: - uses: actions/checkout@v3 - - uses: subosito/flutter-action@v2 - name: Import GPG key @@ -54,6 +53,12 @@ jobs: echo "::set-output name=tag::$TAG" if [ -n "$(echo $TAG | grep -oP '\-beta$')" ]; then BETA=true; else BETA=false; fi echo "::set-output name=beta::$BETA" + + - name: Create Tag + uses: laputansoft/github-tag-action@v4.6 + with: + github_token: ${{ secrets.GH_ACCESS_TOKEN }} + tag: "${{ steps.extract_version.outputs.tag }}" - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 From abfec51964ef1b03cac7040a99af3fcaf2a98702 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:40:34 -0400 Subject: [PATCH 50/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e817961..b0450f8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,7 @@ jobs: unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" - ls -l + ls -l ./build/app/outputs/flutter-apk/ # sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha1 done From 2cb750a7b045a8c523803174b6e15b5fd8d7321b Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:56:27 -0400 Subject: [PATCH 51/85] Update release.yml --- .github/workflows/release.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0450f8..ce5f6a2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,6 +23,8 @@ jobs: run: | sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle flutter build apk && flutter build apk --split-per-abi + rm ./build/app/outputs/flutter-apk/*.sha1 + ls -l ./build/app/outputs/flutter-apk/ - name: Sign APKs env: @@ -35,9 +37,9 @@ jobs: unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" - ls -l ./build/app/outputs/flutter-apk/ - # sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 - gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha1 + rm "$apk".idsig + sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 + gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done rm apksign.keystore PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" From c75416f9be32539c3c3f7c9768247b7461031a29 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:02:53 -0400 Subject: [PATCH 52/85] Update release.yml --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce5f6a2..cbdf064 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,6 @@ jobs: unsignedFn=${apk/-release/-unsigned} mv "$apk" "$unsignedFn" ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" - rm "$apk".idsig sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 done From 9bbff1f4360a3e0c855c4e711187f9b97206cf37 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:08:43 -0400 Subject: [PATCH 53/85] 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 cbdf064..39def93 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,10 +56,10 @@ jobs: echo "::set-output name=beta::$BETA" - name: Create Tag - uses: laputansoft/github-tag-action@v4.6 + uses: mathieudutour/github-tag-action@v6.1 with: github_token: ${{ secrets.GH_ACCESS_TOKEN }} - tag: "${{ steps.extract_version.outputs.tag }}" + custom_tag: "${{ steps.extract_version.outputs.tag }}" - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 From 2c006748351aa4e1a1586d88d13256357263c26d Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:20:03 -0400 Subject: [PATCH 54/85] 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 39def93..3886b94 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -60,6 +60,7 @@ jobs: with: github_token: ${{ secrets.GH_ACCESS_TOKEN }} custom_tag: "${{ steps.extract_version.outputs.tag }}" + tag_prefix: "" - name: Create Release And Upload APKs uses: ncipollo/release-action@v1 @@ -68,6 +69,7 @@ jobs: tag: "${{ steps.extract_version.outputs.tag }}" prerelease: "${{ steps.extract_version.outputs.beta }}" artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* + body: ${{ steps.tag_version.outputs.changelog }} draft: true - name: Archive Reports For Job From a5b2d06742bba73ebb7ce9f3d865725ae44d717a Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 01:33:34 -0400 Subject: [PATCH 55/85] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3886b94..fda3b76 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,7 +69,7 @@ jobs: tag: "${{ steps.extract_version.outputs.tag }}" prerelease: "${{ steps.extract_version.outputs.beta }}" artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* - body: ${{ steps.tag_version.outputs.changelog }} + generateReleaseNotes: true draft: true - name: Archive Reports For Job From 811bc6434b019ffddbf4ba296c5981a3fa64418f Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:00:13 -0400 Subject: [PATCH 56/85] Update release.yml --- .github/workflows/release.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fda3b76..2235561 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,18 +42,16 @@ jobs: done rm apksign.keystore PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" - gpg --batch --yes --delete-secret-keys "$PGP_KEY_FINGERPRINT" - gpg --batch --yes --delete-keys "$PGP_KEY_FINGERPRINT" - name: Extract Version id: extract_version run: | VERSION=$(grep -oP "currentVersion = '\K[^']+" lib/main.dart) - echo "::set-output name=version::$VERSION" + echo "version=$VERSION" >> $GITHUB_OUTPUT TAG=$(grep -oP "'.*\\\$currentVersion.*'" lib/main.dart | head -c -2 | tail -c +2 | sed "s/\$currentVersion/$VERSION/g") - echo "::set-output name=tag::$TAG" + echo "tag=$TAG" >> $GITHUB_OUTPUT if [ -n "$(echo $TAG | grep -oP '\-beta$')" ]; then BETA=true; else BETA=false; fi - echo "::set-output name=beta::$BETA" + echo "beta=$BETA" >> $GITHUB_OUTPUT - name: Create Tag uses: mathieudutour/github-tag-action@v6.1 @@ -71,10 +69,3 @@ jobs: artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* generateReleaseNotes: true draft: true - - - name: Archive Reports For Job - uses: actions/upload-artifact@v3 - with: - name: reports - path: '*/build/reports' - if: ${{ always() }} From 1e009e2211f3b6e2cdcff45d99e987fa4f1ef5f9 Mon Sep 17 00:00:00 2001 From: Imran Remtulla <30463115+ImranR98@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:03:18 -0400 Subject: [PATCH 57/85] 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 2235561..7ac5e34 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release (as Draft) +name: Build and Release on: workflow_dispatch: @@ -68,4 +68,3 @@ jobs: prerelease: "${{ steps.extract_version.outputs.beta }}" artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* generateReleaseNotes: true - draft: true From 5aabcccfd40580391bd0f945e7f821b7ad24527a Mon Sep 17 00:00:00 2001 From: John Betaro <114379310+JohnBetaro@users.noreply.github.com> Date: Sat, 7 Oct 2023 09:53:34 +0100 Subject: [PATCH 58/85] Update fdroid.dart --- lib/app_sources/fdroid.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index 1201062..c7b2dda 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -11,6 +11,7 @@ class FDroid extends AppSource { FDroid() { host = 'f-droid.org'; name = tr('fdroid'); + naiveStandardVersionDetection = true; canSearch = true; additionalSourceAppSpecificSettingFormItems = [ [ From 71755763b9a50fade54de91c911e3ea086a0eb38 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 7 Oct 2023 13:15:22 -0400 Subject: [PATCH 59/85] Enabled WhatsApp Source (#357) --- lib/app_sources/whatsapp.dart | 48 ++++++++---------------------- lib/providers/source_provider.dart | 3 +- 2 files changed, 15 insertions(+), 36 deletions(-) diff --git a/lib/app_sources/whatsapp.dart b/lib/app_sources/whatsapp.dart index f17d8a0..ff295b4 100644 --- a/lib/app_sources/whatsapp.dart +++ b/lib/app_sources/whatsapp.dart @@ -16,14 +16,13 @@ class WhatsApp extends AppSource { @override Future apkUrlPrefetchModifier( String apkUrl, String standardUrl) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); + Response res = await sourceRequest('$standardUrl/android'); if (res.statusCode == 200) { var targetLinks = parse(res.body) .querySelectorAll('a') .map((e) => e.attributes['href'] ?? '') .where((e) => e.isNotEmpty) - .where((e) => - e.contains('content.whatsapp.net') && e.contains('WhatsApp.apk')) + .where((e) => e.contains('WhatsApp.apk')) .toList(); if (targetLinks.isEmpty) { throw NoAPKError(); @@ -39,37 +38,16 @@ class WhatsApp extends AppSource { String standardUrl, Map additionalSettings, ) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); - if (res.statusCode == 200) { - var targetElements = parse(res.body) - .querySelectorAll('p') - .where((element) => element.innerHtml.contains('Version ')) - .toList(); - if (targetElements.isEmpty) { - throw NoVersionError(); - } - var vLines = targetElements[0] - .innerHtml - .split('\n') - .where((element) => element.contains('Version ')) - .toList(); - if (vLines.isEmpty) { - throw NoVersionError(); - } - var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(vLines[0]); - if (versionMatch == null) { - throw NoVersionError(); - } - String version = - vLines[0].substring(versionMatch.start, versionMatch.end); - return APKDetails( - version, - getApkUrlsFromUrls([ - 'https://www.whatsapp.com/android?v=$version&=thisIsaPlaceholder&a=realURLPrefetchedAtDownloadTime' - ]), - AppNames('Meta', 'WhatsApp')); - } else { - throw getObtainiumHttpError(res); - } + // This is a CDN link that is consistent per version + // But it has query params that change constantly + Uri apkUri = + Uri.parse(await apkUrlPrefetchModifier(standardUrl, standardUrl)); + var unusableApkUrl = '${apkUri.origin}/${apkUri.path}'; + // So we use the param-less URL is a pseudo-version to add the app and check for updates + // See #357 for why we can't scrape the version number directly + // But we re-fetch the URL again with its latest query params at the actual download time + String version = unusableApkUrl.hashCode.toString(); + return APKDetails(version, getApkUrlsFromUrls([unusableApkUrl]), + AppNames('Meta', 'WhatsApp')); } } diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index b4b732f..958f8e9 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -28,6 +28,7 @@ import 'package:obtainium/app_sources/steammobile.dart'; import 'package:obtainium/app_sources/telegramapp.dart'; import 'package:obtainium/app_sources/uptodown.dart'; import 'package:obtainium/app_sources/vlc.dart'; +import 'package:obtainium/app_sources/whatsapp.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/mass_app_sources/githubstars.dart'; @@ -557,7 +558,7 @@ class SourceProvider { Mullvad(), Signal(), VLC(), - // WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date + WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date TelegramApp(), SteamMobile(), NeutronCode(), From 3536dcd775449ad97d9963e19a49e7c1cdb2750c Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 7 Oct 2023 13:31:02 -0400 Subject: [PATCH 60/85] Increment version --- lib/main.dart | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index d3343ea..76fb6c2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.23'; +const String currentVersion = '0.14.24'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.yaml b/pubspec.yaml index 5c82b0f..4b672df 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: 0.14.23+215 # When changing this, update the tag in main() accordingly +version: 0.14.24+216 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From 2a0b68d63764b37bf4c0eaa8323afe654f410aff Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 8 Oct 2023 17:30:08 -0400 Subject: [PATCH 61/85] Less notif spam, no check in aeroplane mode (#974) --- lib/custom_errors.dart | 18 +++++++++++++---- lib/providers/apps_provider.dart | 34 +++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 04e6104..657a82a 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:android_package_installer/android_package_installer.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -72,6 +74,9 @@ class MultiAppMultiError extends ObtainiumError { MultiAppMultiError() : super(tr('placeholder'), unexpected: true); add(String appId, dynamic error, {String? appName}) { + if (error is SocketException) { + error = error.message; + } rawErrors[appId] = error; var string = error.toString(); var tempIds = idsByErrorString.remove(string); @@ -83,12 +88,17 @@ class MultiAppMultiError extends ObtainiumError { } } - String errorString(String appId) => - '${appIdNames.containsKey(appId) ? '${appIdNames[appId]} ($appId)' : appId}: ${rawErrors[appId].toString()}'; + String errorString(String appId, {bool includeIdsWithNames = false}) => + '${appIdNames.containsKey(appId) ? '${appIdNames[appId]}${includeIdsWithNames ? ' ($appId)' : ''}' : appId}: ${rawErrors[appId].toString()}'; + + String errorsAppsString(String errString, List appIds, + {bool includeIdsWithNames = false}) => + '$errString [${list2FriendlyString(appIds.map((id) => appIdNames.containsKey(id) == true ? '${appIdNames[id]}${includeIdsWithNames ? ' ($id)' : ''}' : id).toList())}]'; @override - String toString() => - idsByErrorString.keys.map((e) => errorString(e)).join('\n\n'); + String toString() => idsByErrorString.entries + .map((e) => errorsAppsString(e.key, e.value)) + .join('\n\n'); } showError(dynamic e, BuildContext context) { diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 9acd085..330a605 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1375,6 +1375,30 @@ Future bgUpdateCheck(int taskId, Map? params) async { logs.add( 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); + var netResult = await (Connectivity().checkConnectivity()); + + if (netResult == ConnectivityResult.none) { + var networkBasedRetryInterval = 15; + var nextRegularCheck = appsProvider.settingsProvider.lastBGCheckTime + .add(Duration(minutes: appsProvider.settingsProvider.updateInterval)); + var potentialNetworkRetryCheck = + DateTime.now().add(Duration(minutes: networkBasedRetryInterval)); + var shouldRetry = potentialNetworkRetryCheck.isBefore(nextRegularCheck); + logs.add( + 'BG update task $taskId: No network. Will ${shouldRetry ? 'retry in $networkBasedRetryInterval minutes' : 'not retry'}.'); + AndroidAlarmManager.oneShot( + const Duration(minutes: 15), taskId + 1, bgUpdateCheck, + params: { + 'toCheck': toCheck + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + 'toInstall': toInstall + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + }); + return; + } + if (!installMode) { // If in update mode, we check for updates. // We divide the results into 4 groups: @@ -1391,7 +1415,7 @@ Future bgUpdateCheck(int taskId, Map? params) async { List toNotify = []; List> toRetry = []; var retryAfterXSeconds = 0; - List toThrow = []; + MultiAppMultiError toThrow = MultiAppMultiError(); var networkRestricted = false; if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { var netResult = await (Connectivity().checkConnectivity()); @@ -1427,7 +1451,7 @@ Future bgUpdateCheck(int taskId, Map? params) async { retryAfterXSeconds = minRetryIntervalForThisApp; } } else { - toThrow.add(key); + toThrow.add(key, err, appName: errors?.appIdNames[key]); } }); } else { @@ -1455,10 +1479,10 @@ Future bgUpdateCheck(int taskId, Map? params) async { } // Send the error notifications - if (toThrow.isNotEmpty) { - for (var appId in toThrow) { + if (toThrow.rawErrors.isNotEmpty) { + for (var element in toThrow.idsByErrorString.entries) { notificationsProvider.notify(ErrorCheckingUpdatesNotification( - errors!.errorString(appId), + errors!.errorsAppsString(element.key, element.value), id: Random().nextInt(10000))); } } From 7453d19d27b4d4861bd66f2bed29c522af01d4bc Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 8 Oct 2023 17:32:41 -0400 Subject: [PATCH 62/85] Increment version, update packages --- lib/main.dart | 2 +- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 76fb6c2..a9170e5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.24'; +const String currentVersion = '0.14.25'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.lock b/pubspec.lock index fe8eaa3..2b5884c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -46,10 +46,10 @@ packages: dependency: transitive description: name: archive - sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4" + sha256: ca12e6c9ac022f33fd89128e7007fb5e97ab6e814d4fa05dd8d4f2db1e3c69cb url: "https://pub.dev" source: hosted - version: "3.4.4" + version: "3.4.5" args: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4b672df..2e43923 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: 0.14.24+216 # When changing this, update the tag in main() accordingly +version: 0.14.25+217 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' From f4a902ee474cc86d1a7a8883250d344dc384a8dc Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:52:50 +0200 Subject: [PATCH 63/85] Update de.json added three missing lines and translated them, reverted translation of variables so log function can work again. --- assets/translations/de.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index bf8198f..a554cd6 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Aktualisierungen wurden versucht", "appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Updates 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.", "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", "verifyLatestTag": "Überprüfe das „latest“ Tag", + "intermediateLinkRegex": "Filter für einen \"Zwischen\"-Link, der zuerst besucht werden soll", + "intermediateLinkNotFound": "Zwischenlink nicht gefunden", "exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)", "bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist", "autoSelectHighestVersionCode": "Automatisch höchste APK-Code-Version auswählen", @@ -297,8 +300,8 @@ "other": "{} Tage" }, "clearedNLogsBeforeXAfterY": { - "one": "{n} Log gelöscht (vorher = {vorher}, nachher = {nachher})", - "other": "{n} Logs gelöscht (vorher = {vorher}, nachher = {nachher})" + "one": "{n} Log gelöscht (vorher = {before}, nachher = {after})", + "other": "{n} Logs gelöscht (vorher = {before}, nachher = {after})" }, "xAndNMoreUpdatesAvailable": { "one": "{} und 1 weitere App haben Aktualisierungen.", From 95f19208adac3c8297d0a1ab37debdae69fae7d5 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:54:24 +0200 Subject: [PATCH 64/85] Update bs.json added three missing lines, no translation --- assets/translations/bs.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 5ddd49f..c28637b 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", @@ -312,4 +315,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} \ No newline at end of file +} From 63b76a249f86ddd6fff17683ef41a3a7f4a77e39 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:57:52 +0200 Subject: [PATCH 65/85] Update es.json added three missing lines, no translation --- assets/translations/es.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/translations/es.json b/assets/translations/es.json index c1231fe..b835405 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", From c26649d5f2d1bbfbacb0d37fb0819a431efd3bdb Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:58:42 +0200 Subject: [PATCH 66/85] Update fa.json added three missing lines, no translation --- assets/translations/fa.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/translations/fa.json b/assets/translations/fa.json index c35bc60..e2c51a3 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", From 00854abd1a006efccab755106f5548328401635f Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 14:59:14 +0200 Subject: [PATCH 67/85] Update fr.json added three missing lines, no translation --- assets/translations/fr.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 7e0d414..c057e28 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", From a7a26037aef9d56124792b1baef9ef3b51645b21 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:02:51 +0200 Subject: [PATCH 68/85] Update hu.json added four missing lines, no translation --- assets/translations/hu.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 363d691..828bc7f 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -194,6 +194,7 @@ "categories": "Kategóriák", "category": "Kategória", "noCategory": "Nincs kategória", + "noCategories": "No Categories", "deleteCategoryQuestion": "Törli a kategóriát?", "categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", "addCategory": "Új kategória", @@ -241,9 +242,12 @@ "appsPossiblyUpdated": "App frissítési kísérlet", "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", From ce6e51128d2fef563728391e2725341ac7139c72 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:04:45 +0200 Subject: [PATCH 69/85] Update it.json added three missing lines, no translation --- assets/translations/it.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/assets/translations/it.json b/assets/translations/it.json index 3f3fc40..8818644 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", From ba59693d9082fc4f5a661d95297275fe4a9d3567 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:17:52 +0200 Subject: [PATCH 70/85] Update pl.json Changed order of the lines so it's the same order for every language and better to compare --- assets/translations/pl.json | 39 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 0cf28fd..8519fa2 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -1,14 +1,4 @@ { - "noDescription": "Brak opisu", - "no": "Nie", - "okay": "Okej", - "appId": "ID aplikacji", - "bgUpdateGotErrorRetryInMinutes": { - "one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę", - "few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty", - "many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut", - "other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty" - }, "invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}", "noReleaseFound": "Nie można znaleźć odpowiedniego wydania", "noVersionFound": "Nie można określić wersji wydania", @@ -26,6 +16,7 @@ "fallbackToOlderReleases": "Powracaj do starszych wersji", "filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych", "invalidRegEx": "Nieprawidłowe wyrażenie regularne", + "noDescription": "Brak opisu", "cancel": "Anuluj", "continue": "Kontynuuj", "requiredInBrackets": "(Wymagane)", @@ -75,6 +66,7 @@ "installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", "markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?", + "no": "Nie", "yes": "Tak", "markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane", "pinToTop": "Przypnij", @@ -111,7 +103,8 @@ "importErrors": "Błędy importowania", "importedXOfYApps": "Zaimportowano {} z {} aplikacji.", "followingURLsHadErrors": "Następujące adresy URL zawierały błędy:", - "selectURL": "Wybierz adres URL", + "okay": "Okej", + "selectURL": "Wybierz adres URL", "selectURLs": "Wybierz adresy URL", "pick": "Wybierz", "theme": "Motyw", @@ -179,6 +172,7 @@ "yesMarkUpdated": "Tak, oznacz jako zaktualizowane", "fdroid": "Oficjalny F-Droid", "appIdOrName": "ID aplikacji lub nazwa", + "appId": "ID aplikacji", "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", @@ -248,12 +242,15 @@ "appsPossiblyUpdated": "Informuj o próbach aktualizacji", "appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji", "xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.", - "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", + "enableBackgroundUpdates": "Włącz aktualizacje w tle", + "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", - "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", + "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", + "intermediateLinkNotFound": "Nie znaleziono linku pośredniego" + "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", - "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", + "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", "versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję", "matchGroupToUse": "Dopasuj grupę do użycia", "highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe", @@ -276,7 +273,13 @@ "one": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minutę", "few": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty", "many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut", - "other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty" + "other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę", + "few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty", + "many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut", + "other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { "one": "W tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony", @@ -337,8 +340,4 @@ "few": "{} i {} inne apki mogły zostać zaktualizowane.", "many": "{} i {} innych apek mogło zostać zaktualizowanych.", "other": "{} i {} inne apki mogły zostać zaktualizowane." - }, - "enableBackgroundUpdates": "Włącz aktualizacje w tle", - "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", - "intermediateLinkNotFound": "Nie znaleziono linku pośredniego" -} \ No newline at end of file + } From 6955191fddfb3441d1300a8df97519f1d4eec5d7 Mon Sep 17 00:00:00 2001 From: iDazai <50296346+iDazai@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:22:32 +0200 Subject: [PATCH 71/85] Update pl.json fixed line breaks --- assets/translations/pl.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 8519fa2..08bf2c2 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -16,7 +16,7 @@ "fallbackToOlderReleases": "Powracaj do starszych wersji", "filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych", "invalidRegEx": "Nieprawidłowe wyrażenie regularne", - "noDescription": "Brak opisu", + "noDescription": "Brak opisu", "cancel": "Anuluj", "continue": "Kontynuuj", "requiredInBrackets": "(Wymagane)", @@ -66,7 +66,7 @@ "installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", "markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?", - "no": "Nie", + "no": "Nie", "yes": "Tak", "markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane", "pinToTop": "Przypnij", @@ -104,7 +104,7 @@ "importedXOfYApps": "Zaimportowano {} z {} aplikacji.", "followingURLsHadErrors": "Następujące adresy URL zawierały błędy:", "okay": "Okej", - "selectURL": "Wybierz adres URL", + "selectURL": "Wybierz adres URL", "selectURLs": "Wybierz adresy URL", "pick": "Wybierz", "theme": "Motyw", @@ -172,7 +172,7 @@ "yesMarkUpdated": "Tak, oznacz jako zaktualizowane", "fdroid": "Oficjalny F-Droid", "appIdOrName": "ID aplikacji lub nazwa", - "appId": "ID aplikacji", + "appId": "ID aplikacji", "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", @@ -243,12 +243,12 @@ "appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji", "xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.", "enableBackgroundUpdates": "Włącz aktualizacje w tle", - "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", + "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", "intermediateLinkNotFound": "Nie znaleziono linku pośredniego" - "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", + "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", "versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję", From fc7408a8f8aabb251cb7640b2cd6d9029d06d39d Mon Sep 17 00:00:00 2001 From: Daviteusz Date: Mon, 9 Oct 2023 20:11:12 +0200 Subject: [PATCH 72/85] locale(pl): Update Polish translations --- assets/translations/pl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 0cf28fd..74b159e 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -245,7 +245,7 @@ "sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków", "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", - "appsPossiblyUpdated": "Informuj o próbach aktualizacji", + "appsPossiblyUpdated": "Próbowano zaktualizować aplikację", "appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji", "xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.", "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", From 488049821e85bd73c2dfc555fe9fb5ace86f0141 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 11 Oct 2023 20:42:33 -0400 Subject: [PATCH 73/85] Switch back to serial BG installs (#984) --- lib/providers/apps_provider.dart | 198 ++++++++++++++----------------- 1 file changed, 91 insertions(+), 107 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 330a605..614d5a0 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1369,12 +1369,6 @@ Future bgUpdateCheck(int taskId, Map? params) async { (>>[])) ]; - bool installMode = toCheck.isEmpty && - toInstall.isNotEmpty; // Task is either in update mode or install mode - - logs.add( - 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); - var netResult = await (Connectivity().checkConnectivity()); if (netResult == ConnectivityResult.none) { @@ -1399,110 +1393,103 @@ Future bgUpdateCheck(int taskId, Map? params) async { return; } - if (!installMode) { - // If in update mode, we check for updates. - // We divide the results into 4 groups: - // - toNotify - Apps with updates that the user will be notified about (can't be silently installed) - // - toRetry - Apps with update check errors that will be retried in a while - // - toThrow - Apps with update check errors that the user will be notified about (no retry) - // - toInstall - Apps with updates that will be installed silently - // After grouping the updates, we take care of toNotify and toThrow first - // Then if toRetry is not empty, we schedule another update task to run in a while (toInstall is retained) - // If toRetry is empty, we take care of toInstall + var networkRestricted = false; + if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { + networkRestricted = (netResult != ConnectivityResult.wifi) && + (netResult != ConnectivityResult.ethernet); + } - // Init. vars. - List updates = []; - List toNotify = []; - List> toRetry = []; - var retryAfterXSeconds = 0; - MultiAppMultiError toThrow = MultiAppMultiError(); - var networkRestricted = false; - if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { - var netResult = await (Connectivity().checkConnectivity()); - networkRestricted = (netResult != ConnectivityResult.wifi) && - (netResult != ConnectivityResult.ethernet); + bool installMode = + toCheck.isEmpty; // Task is either in update mode or install mode + + // In install mode, grab all available silent updates unless explicitly told otherwise + if (installMode && toInstall.isEmpty && !networkRestricted) { + var temp = appsProvider.findExistingUpdates(installedOnly: true); + for (var i = 0; i < temp.length; i++) { + if (await appsProvider + .canInstallSilently(appsProvider.apps[temp[i]]!.app)) { + toInstall.add(MapEntry(temp[i], 0)); + } } - MultiAppMultiError? errors; - CheckingUpdatesNotification notif = - CheckingUpdatesNotification(plural('apps', toCheck.length)); + } + logs.add( + 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); + + if (!installMode) { + // If in update mode... + var didCompleteChecking = false; + CheckingUpdatesNotification? notif; + // Loop through all updates and check each + List toNotify = []; try { - // Check for updates - notificationsProvider.notify(notif, cancelExisting: true); - updates = await appsProvider.checkUpdates( - specificIds: toCheck.map((e) => e.key).toList()); - } catch (e) { - // If there were errors, group them into toRetry and toThrow - if (e is Map) { - updates = e['updates']; - errors = e['errors']; - errors!.rawErrors.forEach((key, err) { - logs.add( - 'BG update task $taskId: Got error on checking for $key \'${err.toString()}\'.'); - var toCheckApp = toCheck.where((element) => element.key == key).first; - if (toCheckApp.value < maxAttempts) { - toRetry.add(MapEntry(toCheckApp.key, toCheckApp.value + 1)); - var minRetryIntervalForThisApp = err is RateLimitError - ? (err.remainingMinutes * 60) - : e is ClientException - ? (15 * 60) - : pow(toCheckApp.value + 1, 2).toInt(); - if (minRetryIntervalForThisApp > retryAfterXSeconds) { - retryAfterXSeconds = minRetryIntervalForThisApp; + for (int i = 0; i < toCheck.length; i++) { + var appId = toCheck[i].key; + var attemptCount = toCheck[i].value + 1; + AppInMemory? app = appsProvider.apps[appId]; + if (app?.app.installedVersion != null) { + try { + notificationsProvider.notify( + notif = CheckingUpdatesNotification(app?.name ?? appId), + cancelExisting: true); + App? newApp = await appsProvider.checkUpdate(appId); + if (newApp != null) { + if (networkRestricted || + !(await appsProvider.canInstallSilently(app!.app))) { + toNotify.add(newApp); + } + } + if (i == (toCheck.length - 1)) { + didCompleteChecking = true; + } + } catch (e) { + // If you got an error, move the offender to the back of the line (increment their fail count) and schedule another task to continue checking shortly + logs.add( + 'BG update task $taskId: Got error on checking for $appId \'${e.toString()}\'.'); + if (attemptCount < maxAttempts) { + var remainingSeconds = e is RateLimitError + ? (i == 0 ? (e.remainingMinutes * 60) : (5 * 60)) + : e is ClientException + ? (15 * 60) + : pow(attemptCount, 2).toInt(); + logs.add( + 'BG update task $taskId: Will continue in $remainingSeconds seconds (with $appId moved to the end of the line).'); + var remainingToCheck = moveStrToEndMapEntryWithCount( + toCheck.sublist(i), MapEntry(appId, attemptCount)); + AndroidAlarmManager.oneShot(Duration(seconds: remainingSeconds), + taskId + 1, bgUpdateCheck, + params: { + 'toCheck': remainingToCheck + .map( + (entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + 'toInstall': toInstall + .map( + (entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + }); + break; + } else { + // If the offender has reached its fail limit, notify the user and remove it from the list (task can continue) + toCheck.removeAt(i); + i--; + notificationsProvider + .notify(ErrorCheckingUpdatesNotification(e.toString())); + } + } finally { + if (notif != null) { + notificationsProvider.cancel(notif.id); } - } else { - toThrow.add(key, err, appName: errors?.appIdNames[key]); } - }); - } else { - // We don't expect to ever get here in any situation so no need to catch - logs.add('Fatal error in BG update task: ${e.toString()}'); - rethrow; + } } } finally { - notificationsProvider.cancel(notif.id); - } - - // Group the updates into toNotify and toInstall - for (var i = 0; i < updates.length; i++) { - if (networkRestricted || - !(await appsProvider.canInstallSilently(updates[i]))) { - toNotify.add(updates[i]); - } else { - toInstall.add(MapEntry(updates[i].id, 0)); + if (toNotify.isNotEmpty) { + notificationsProvider.notify(UpdateNotification(toNotify)); } } - - // Send the update notification - if (toNotify.isNotEmpty) { - notificationsProvider.notify(UpdateNotification(toNotify)); - } - - // Send the error notifications - if (toThrow.rawErrors.isNotEmpty) { - for (var element in toThrow.idsByErrorString.entries) { - notificationsProvider.notify(ErrorCheckingUpdatesNotification( - errors!.errorsAppsString(element.key, element.value), - id: Random().nextInt(10000))); - } - } - - // if there are update checks to retry, schedule a retry task - if (toRetry.isNotEmpty) { - logs.add( - 'BG update task $taskId: Will retry in $retryAfterXSeconds seconds.'); - AndroidAlarmManager.oneShot( - Duration(seconds: retryAfterXSeconds), taskId + 1, bgUpdateCheck, - params: { - 'toCheck': toRetry - .map((entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - 'toInstall': toInstall - .map((entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - }); - } else if (toInstall.isNotEmpty) { - // If there are no more update checks, schedule an install task + // If you're done checking and found some silently installable updates, schedule another task which will run in install mode + if (didCompleteChecking) { logs.add( 'BG update task $taskId: Done. Scheduling install task to run immediately.'); AndroidAlarmManager.oneShot( @@ -1513,14 +1500,11 @@ Future bgUpdateCheck(int taskId, Map? params) async { .map((entry) => {'key': entry.key, 'value': entry.value}) .toList() }); - } else { - logs.add('BG install task $taskId: Done.'); + } else if (didCompleteChecking) { + logs.add('BG update task $taskId: Done.'); } - } - - if (installMode) { - // If in install mode, we install silent updates. - + } else { + // If in install mode... var didCompleteInstalling = false; var tempObtArr = toInstall.where((element) => element.key == obtainiumId); if (tempObtArr.isNotEmpty) { From 81ea67afa85d0d46602242f1c7c25f4c96997cdf Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 11 Oct 2023 20:43:27 -0400 Subject: [PATCH 74/85] Remove unnecessary log --- lib/providers/apps_provider.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 614d5a0..a46a175 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1136,7 +1136,6 @@ class AppsProvider with ChangeNotifier { return null; } if (exportDir == null) { - logs.add('Skipping auto-export as dir is not set.'); return null; } var files = await saf From c908a710de4791ad19dd9943015e6645b578728b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 11 Oct 2023 20:55:09 -0400 Subject: [PATCH 75/85] Fix UpToDown again (#982) --- lib/app_sources/uptodown.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index 86b640c..c764b7c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -35,7 +35,7 @@ class Uptodown extends AppSource { var html = parse(res.body); String? version = html.querySelector('div.version')?.innerHtml; String? apkUrl = - html.querySelector('#detail-download-button')?.attributes['data-url']; + '${standardUrl.split('/').reversed.toList().sublist(1).reversed.join('/')}/post-download'; String? name = html.querySelector('#detail-app-name')?.innerHtml.trim(); String? author = html.querySelector('#author-link')?.innerHtml.trim(); var detailElements = html.querySelectorAll('#technical-information td'); From 89e44d581f0a93da14bfc1ffb98b623227abcecd Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 11 Oct 2023 20:56:26 -0400 Subject: [PATCH 76/85] Update packages, increment version --- lib/main.dart | 2 +- pubspec.lock | 28 ++++++++++++++-------------- pubspec.yaml | 4 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index a9170e5..bb0ac3a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.25'; +const String currentVersion = '0.14.26'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.lock b/pubspec.lock index 2b5884c..a51aef1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: "direct main" description: name: android_alarm_manager_plus - sha256: c20d91a9096596f66274bf8172321c278f9cba8091638f80205fe66d31587fa5 + sha256: "82fb28c867c4b3dd7e9157728e46426b8916362f977dbba46b949210f00099f4" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" android_intent_plus: dependency: "direct main" description: name: android_intent_plus - sha256: f72ae20bb37108694f442e7ae6acbd28b453ca62ce86842f6787b784355abfe6 + sha256: e1c62bb41c90e15083b7fb84dc327fe90396cc9c1445b55ff1082144fabfb4d9 url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" android_package_installer: dependency: "direct main" description: @@ -46,10 +46,10 @@ packages: dependency: transitive description: name: archive - sha256: ca12e6c9ac022f33fd89128e7007fb5e97ab6e814d4fa05dd8d4f2db1e3c69cb + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" url: "https://pub.dev" source: hosted - version: "3.4.5" + version: "3.4.6" args: dependency: transitive description: @@ -118,10 +118,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b" + sha256: "94d51c6f1299133a2baa4c5c3d2c11ec7d7fb4768dee5c52a56f7d7522fcf70e" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "5.0.0" connectivity_plus_platform_interface: dependency: transitive description: @@ -562,10 +562,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2 + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.11.5" + version: "3.12.0" permission_handler_windows: dependency: transitive description: @@ -586,10 +586,10 @@ packages: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: @@ -634,10 +634,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 2e43923..a860b55 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: 0.14.25+217 # When changing this, update the tag in main() accordingly +version: 0.14.26+218 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' @@ -64,7 +64,7 @@ dependencies: flutter_markdown: ^0.6.14 flutter_archive: ^5.0.0 hsluv: ^1.1.3 - connectivity_plus: ^4.0.2 + connectivity_plus: ^5.0.0 shared_storage: ^0.8.0 dev_dependencies: From d800d3ba4169cda2526cda0268cf462c863da872 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Wed, 11 Oct 2023 21:03:23 -0400 Subject: [PATCH 77/85] Fix issues with last conflit resolution commit --- lib/providers/apps_provider.dart | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index cdc1052..a46a175 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1415,30 +1415,6 @@ Future bgUpdateCheck(int taskId, Map? params) async { logs.add( 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); - var netResult = await (Connectivity().checkConnectivity()); - - if (netResult == ConnectivityResult.none) { - var networkBasedRetryInterval = 15; - var nextRegularCheck = appsProvider.settingsProvider.lastBGCheckTime - .add(Duration(minutes: appsProvider.settingsProvider.updateInterval)); - var potentialNetworkRetryCheck = - DateTime.now().add(Duration(minutes: networkBasedRetryInterval)); - var shouldRetry = potentialNetworkRetryCheck.isBefore(nextRegularCheck); - logs.add( - 'BG update task $taskId: No network. Will ${shouldRetry ? 'retry in $networkBasedRetryInterval minutes' : 'not retry'}.'); - AndroidAlarmManager.oneShot( - const Duration(minutes: 15), taskId + 1, bgUpdateCheck, - params: { - 'toCheck': toCheck - .map((entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - 'toInstall': toInstall - .map((entry) => {'key': entry.key, 'value': entry.value}) - .toList(), - }); - return; - } - if (!installMode) { // If in update mode... var didCompleteChecking = false; @@ -1503,8 +1479,6 @@ Future bgUpdateCheck(int taskId, Map? params) async { if (notif != null) { notificationsProvider.cancel(notif.id); } - } else { - toThrow.add(key, err, appName: errors?.appIdNames[key]); } } } From 910ed265256902a4e8c8a2e5335486886a2a765b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 18:31:31 -0400 Subject: [PATCH 78/85] Fixed issues in some translation files --- assets/translations/hu.json | 1 - assets/translations/pl.json | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 828bc7f..c0cd3b3 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -242,7 +242,6 @@ "appsPossiblyUpdated": "App frissítési kísérlet", "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", - "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", diff --git a/assets/translations/pl.json b/assets/translations/pl.json index c0cbb3a..21db5f1 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -247,7 +247,7 @@ "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", - "intermediateLinkNotFound": "Nie znaleziono linku pośredniego" + "intermediateLinkNotFound": "Nie znaleziono linku pośredniego", "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", @@ -341,3 +341,4 @@ "many": "{} i {} innych apek mogło zostać zaktualizowanych.", "other": "{} i {} inne apki mogły zostać zaktualizowane." } +} \ No newline at end of file From 7ff6916e5fa41896e193408541fadc5d1994e3af Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 18:57:47 -0400 Subject: [PATCH 79/85] Better relative link resolution (#989) --- lib/app_sources/html.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 4cb9b26..ee1593a 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -22,7 +22,7 @@ String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { } else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) { return '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl'; } else { - return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - 1).join('/')}/$ambiguousUrl'; + return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - (currPathSegments.last.contains('.') ? 1 : 0)).join('/')}/$ambiguousUrl'; } } From 723f7e63e977b280336db5dc50a480c37773b56b Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:06:59 -0400 Subject: [PATCH 80/85] Add whole-page version extraction for HTML (#989) --- assets/translations/bs.json | 1 + assets/translations/cs.json | 1 + assets/translations/de.json | 1 + assets/translations/en.json | 3 ++- assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 1 + assets/translations/pl.json | 1 + assets/translations/pt.json | 1 + assets/translations/ru.json | 1 + assets/translations/zh.json | 1 + lib/app_sources/html.dart | 9 ++++++++- 15 files changed, 23 insertions(+), 2 deletions(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index c28637b..56191e8 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 0aceed9..b8c9e9a 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index a554cd6..124e759 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menü", "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index a283052..d790e89 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -252,7 +252,7 @@ "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", + "matchGroupToUse": "Match Group to Use for Version Extraction Regex", "highlightTouchTargets": "Highlight less obvious touch targets", "pickExportDir": "Pick Export Directory", "autoExportOnChanges": "Auto-export on changes", @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index b835405..df72937 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index e2c51a3..2f78a02 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index c057e28..43bf149 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index c0cd3b3..5402c95 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -263,6 +263,7 @@ "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", "enableBackgroundUpdates": "Frissítések a háttérben", "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazást?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 8818644..62a5911 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 4f6c398..55d9a4d 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -263,6 +263,7 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 21db5f1..ef4d950 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -263,6 +263,7 @@ "debugMenu": "Menu debugowania", "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 1271fc5..d30faea 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -263,6 +263,7 @@ "debugMenu": "Menu Debug", "bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.", "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 8ea5c0f..c725b05 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -263,6 +263,7 @@ "debugMenu": "Меню Отладки", "bgTaskStarted": "Фоновая задача начата - проверьте журналы.", "runBgCheckNow": "Запустить проверку фонового обновления сейчас", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 69954f9..615eb90 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -263,6 +263,7 @@ "debugMenu": "调试选项", "bgTaskStarted": "后台任务已启动 - 详见日志", "runBgCheckNow": "立即进行后台更新检查", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index ee1593a..91911e7 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -117,6 +117,8 @@ class HTML extends AppSource { label: tr('versionExtractionRegEx'), required: false, additionalValidators: [(value) => regExValidator(value)]), + ], + [ GeneratedFormTextField('matchGroupToUse', label: tr('matchGroupToUse'), required: false, @@ -131,6 +133,10 @@ class HTML extends AppSource { return intValidator(value); } ]) + ], + [ + GeneratedFormSwitch('versionExtractWholePage', + label: tr('versionExtractWholePage')) ] ]; overrideVersionDetectionFormDefault('noVersionDetection', @@ -212,7 +218,8 @@ class HTML extends AppSource { var versionExtractionRegEx = additionalSettings['versionExtractionRegEx'] as String?; if (versionExtractionRegEx?.isNotEmpty == true) { - var match = RegExp(versionExtractionRegEx!).allMatches(rel); + var match = RegExp(versionExtractionRegEx!).allMatches( + res.body.split('\r\n').join('\n').split('\n').join('\\n')); if (match.isEmpty) { throw NoVersionError(); } From 503a01675ecc3420945f40c0b540a9234a666908 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:10:02 -0400 Subject: [PATCH 81/85] Clearer wording (#991) --- assets/translations/bs.json | 1 + assets/translations/cs.json | 1 + assets/translations/de.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 1 + assets/translations/pl.json | 1 + assets/translations/pt.json | 1 + assets/translations/ru.json | 1 + assets/translations/zh.json | 1 + lib/pages/apps.dart | 2 +- 15 files changed, 15 insertions(+), 1 deletion(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 56191e8..7aa21c2 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index b8c9e9a..d20bdfb 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 124e759..4e27572 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index d790e89..7f9316b 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index df72937..74bab70 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 2f78a02..8787732 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 43bf149..dce0ea8 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 5402c95..f942af4 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -264,6 +264,7 @@ "enableBackgroundUpdates": "Frissítések a háttérben", "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazást?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 62a5911..9c97af4 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 55d9a4d..eaa6a40 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index ef4d950..6d09cb6 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index d30faea..fd00a8f 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.", "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index c725b05..c67269b 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -264,6 +264,7 @@ "bgTaskStarted": "Фоновая задача начата - проверьте журналы.", "runBgCheckNow": "Запустить проверку фонового обновления сейчас", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 615eb90..55fcb0b 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -264,6 +264,7 @@ "bgTaskStarted": "后台任务已启动 - 详见日志", "runBgCheckNow": "立即进行后台更新检查", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index fe98aa9..49feff6 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -566,7 +566,7 @@ class AppsPageState extends State { .toInt() .toString() ]) - : tr('pleaseWait'), + : tr('installing'), textAlign: (listedApps[index].downloadProgress! >= 0) ? TextAlign.start : TextAlign.end, From e613a494ffc52d46aac1532669efa3326d05e0d2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:24:23 -0400 Subject: [PATCH 82/85] Better error for some incompatible APK cases (#981) --- lib/providers/apps_provider.dart | 36 ++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index a46a175..588ca1b 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -263,25 +263,29 @@ class AppsProvider with ChangeNotifier { return downloadedFile; } - Future handleAPKIDChange(App app, PackageInfo newInfo, + Future handleAPKIDChange(App app, PackageInfo? newInfo, File downloadedFile, String downloadUrl) async { // If the APK package ID is different from the App ID, it is either new (using a placeholder ID) or the ID has changed // The former case should be handled (give the App its real ID), the latter is a security issue - if (app.id != newInfo.packageName) { - var isTempId = SourceProvider().isTempId(app); - if (apps[app.id] != null && !isTempId && !app.allowIdChange) { - throw IDChangedError(newInfo.packageName!); - } - var idChangeWasAllowed = app.allowIdChange; - app.allowIdChange = false; - var originalAppId = app.id; - app.id = newInfo.packageName!; - downloadedFile = downloadedFile.renameSync( - '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}'); - if (apps[originalAppId] != null) { - await removeApps([originalAppId]); - await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed); + var isTempId = SourceProvider().isTempId(app); + if (newInfo != null) { + if (app.id != newInfo.packageName) { + if (apps[app.id] != null && !isTempId && !app.allowIdChange) { + throw IDChangedError(newInfo.packageName!); + } + var idChangeWasAllowed = app.allowIdChange; + app.allowIdChange = false; + var originalAppId = app.id; + app.id = newInfo.packageName!; + downloadedFile = downloadedFile.renameSync( + '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}'); + if (apps[originalAppId] != null) { + await removeApps([originalAppId]); + await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed); + } } + } else if (isTempId) { + throw ObtainiumError('Could not get ID from APK'); } return downloadedFile; } @@ -344,7 +348,7 @@ class AppsProvider with ChangeNotifier { await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path); } downloadedFile = - await handleAPKIDChange(app, newInfo!, downloadedFile, downloadUrl); + await handleAPKIDChange(app, newInfo, downloadedFile, downloadUrl); // Delete older versions of the file if any for (var file in downloadedFile.parent.listSync()) { var fn = file.path.split('/').last; From d06f20690dae3aa50f8121d146218400bd9fef2d Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:33:38 -0400 Subject: [PATCH 83/85] Add 'skip update notification' per-app toggle (#980) --- assets/translations/bs.json | 1 + assets/translations/cs.json | 1 + assets/translations/de.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 1 + assets/translations/pl.json | 1 + assets/translations/pt.json | 1 + assets/translations/ru.json | 1 + assets/translations/zh.json | 1 + lib/providers/apps_provider.dart | 5 ++++- lib/providers/source_provider.dart | 4 ++++ 16 files changed, 22 insertions(+), 1 deletion(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 7aa21c2..2749d95 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Želite li ukloniti aplikaciju?", "other": "Želite li ukloniti aplikacije?" diff --git a/assets/translations/cs.json b/assets/translations/cs.json index d20bdfb..2f6ea78 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" diff --git a/assets/translations/de.json b/assets/translations/de.json index 4e27572..fe2a44d 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" diff --git a/assets/translations/en.json b/assets/translations/en.json index 7f9316b..3d68d57 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" diff --git a/assets/translations/es.json b/assets/translations/es.json index 74bab70..3003f67 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 8787732..7c24b96 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" diff --git a/assets/translations/fr.json b/assets/translations/fr.json index dce0ea8..2eb17dc 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index f942af4..b94b173 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Eltávolítja az alkalmazást?", "other": "Eltávolítja az alkalmazást?" diff --git a/assets/translations/it.json b/assets/translations/it.json index 9c97af4..10ce3f3 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index eaa6a40..c1edaf5 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Run Background Update Check Now", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 6d09cb6..72278c3 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index fd00a8f..31ff890 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" diff --git a/assets/translations/ru.json b/assets/translations/ru.json index c67269b..9628df3 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -265,6 +265,7 @@ "runBgCheckNow": "Запустить проверку фонового обновления сейчас", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 55fcb0b..609aff5 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -265,6 +265,7 @@ "runBgCheckNow": "立即进行后台更新检查", "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 588ca1b..db1087b 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -1439,7 +1439,10 @@ Future bgUpdateCheck(int taskId, Map? params) async { if (newApp != null) { if (networkRestricted || !(await appsProvider.canInstallSilently(app!.app))) { - toNotify.add(newApp); + if (newApp.additionalSettings['skipUpdateNotifications'] != + true) { + toNotify.add(newApp); + } } } if (i == (toCheck.length - 1)) { diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 958f8e9..0ac9b91 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -442,6 +442,10 @@ abstract class AppSource { [ GeneratedFormSwitch('exemptFromBackgroundUpdates', label: tr('exemptFromBackgroundUpdates')) + ], + [ + GeneratedFormSwitch('skipUpdateNotifications', + label: tr('skipUpdateNotifications')) ] ]; From 2d7465cca62011d963c147b64e3212556a0b76c2 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:51:04 -0400 Subject: [PATCH 84/85] Separate notif channel title translations (#979) --- assets/translations/bs.json | 640 ++++++++++----------- assets/translations/cs.json | 47 +- assets/translations/de.json | 10 +- assets/translations/en.json | 10 +- assets/translations/es.json | 10 +- assets/translations/fa.json | 10 +- assets/translations/fr.json | 10 +- assets/translations/hu.json | 650 +++++++++++----------- assets/translations/it.json | 10 +- assets/translations/ja.json | 10 +- assets/translations/pl.json | 22 +- assets/translations/pt.json | 10 +- assets/translations/ru.json | 10 +- assets/translations/zh.json | 10 +- lib/providers/notifications_provider.dart | 32 +- 15 files changed, 807 insertions(+), 684 deletions(-) diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 2749d95..acca651 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -1,321 +1,329 @@ { - "invalidURLForSource": "Nije važeći URL aplikacije {}", - "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje", - "noVersionFound": "Nije moguće odrediti verziju izdanja", - "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom", - "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije", - "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije", - "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju", - "placeholder": "Rezervirano mjesto", - "someErrors": "Došlo je do nekih grešaka", - "unexpectedError": "Neočekivana greška", - "ok": "Dobro", - "and": "i", - "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)", - "includePrereleases": "Uključi preliminarna izdanja", - "fallbackToOlderReleases": "Povratak na starija izdanja", - "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu", - "invalidRegEx": "Nevažeći regularni izraz", - "noDescription": "Bez opisa", - "cancel": "Otkaži", - "continue": "Nastavite", - "requiredInBrackets": "(obavezno)", - "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", - "colour": "Boja", - "githubStarredRepos": "GitHub repo-i sa zvjezdicom", - "uname": "Korisničko ime", - "wrongArgNum": "Naveden je pogrešan broj argumenata", - "xIsTrackOnly": "{} je samo za praćenje", - "source": "Izvor", - "app": "Aplikacija. ", - "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.", - "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.", - "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.", - "cancelled": "Otkazano", - "appAlreadyAdded": "Aplikacija je već dodana", - "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?", - "addApp": "Dodaj aplikaciju", - "appSourceURL": "Izvorni URL aplikacije", - "error": "Greška", - "add": "Dodaj", - "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)", - "search": "Pretraživanje", - "additionalOptsFor": "Dodatne opcije za {}", - "supportedSources": "Podržani izvori", - "trackOnlyInBrackets": "(Samo za praćenje)", - "searchableInBrackets": "(Može se pretraživati)", - "appsString": "Aplikacije", - "noApps": "Nema aplikacija", - "noAppsForFilter": "Nema aplikacija za filter", - "byX": "Autor {}", - "percentProgress": "Napredak: {}%", - "pleaseWait": "Molimo sačekajte", - "updateAvailable": "Ažuriranje dostupno", - "estimateInBracketsShort": "(Procjena)", - "notInstalled": "Nije instalirano", - "estimateInBrackets": "(Procjena)", - "selectAll": "Označi sve", - "deselectN": "Poništi odabir {}", - "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.", - "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?", - "removeSelectedApps": "Ukloni odabrane aplikacije", - "updateX": "Nadogradi {}", - "installX": "Instaliraj {}", - "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano", - "changeX": "Promjena {}", - "installUpdateApps": "Instalirajte/ažurirajte aplikacije", - "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije", - "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?", - "no": "Ne", - "yes": "Da", - "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane", - "pinToTop": "Prikvači na vrh", - "unpinFromTop": "Otkvači sa vrha", - "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?", - "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.", - "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija", - "resetInstallStatus": "Resetujte status instalacije", - "more": "Više", - "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", - "showOutdatedOnly": "Prikaži samo zastarjele aplikacije", - "filter": "Filtriranje", - "filterActive": "Filtriranje", - "filterApps": "Filtriraj aplikacije", - "appName": "Naziv aplikacije", - "author": "Autor", - "upToDateApps": "Ažurirane aplikacije", - "nonInstalledApps": "Neinstalirane aplikacije", - "importExport": "Uvoz/izvoz", - "settings": "Postavke", - "exportedTo": "Izvezeno u {}", - "obtainiumExport": "Obtainium Export", - "invalidInput": "Neispravan unos.", - "importedX": "Uvezeno {}", - "obtainiumImport": "Obtainium uvoz", - "importFromURLList": "Uvoz iz URL liste", - "searchQuery": "Pretraga za: ", - "appURLList": "Lista URL adresa aplikacija", - "line": "Linija", - "searchX": "Pretraživanje {}", - "noResults": "Nema rezultata", - "importX": "Uvoz {}", - "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.", - "importErrors": "Uvezi greške", - "importedXOfYApps": "{} od {} aplikacija uvezeno.", - "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:", - "okay": "Dobro", - "selectURL": "Odaberite URL", - "selectURLs": "Odaberite URL-ove", - "pick": "Odaberi", - "theme": "Tema", - "dark": "Tamna", - "light": "Svijetla", - "followSystem": "Pratite sistem", + "invalidURLForSource": "Nije važeći URL aplikacije {}", + "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje", + "noVersionFound": "Nije moguće odrediti verziju izdanja", + "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom", + "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije", + "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije", + "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju", + "placeholder": "Rezervirano mjesto", + "someErrors": "Došlo je do nekih grešaka", + "unexpectedError": "Neočekivana greška", + "ok": "Dobro", + "and": "i", + "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)", + "includePrereleases": "Uključi preliminarna izdanja", + "fallbackToOlderReleases": "Povratak na starija izdanja", + "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu", + "invalidRegEx": "Nevažeći regularni izraz", + "noDescription": "Bez opisa", + "cancel": "Otkaži", + "continue": "Nastavite", + "requiredInBrackets": "(obavezno)", + "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", + "colour": "Boja", + "githubStarredRepos": "GitHub repo-i sa zvjezdicom", + "uname": "Korisničko ime", + "wrongArgNum": "Naveden je pogrešan broj argumenata", + "xIsTrackOnly": "{} je samo za praćenje", + "source": "Izvor", + "app": "Aplikacija. ", + "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.", + "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.", + "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.", + "cancelled": "Otkazano", + "appAlreadyAdded": "Aplikacija je već dodana", + "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?", + "addApp": "Dodaj aplikaciju", + "appSourceURL": "Izvorni URL aplikacije", + "error": "Greška", + "add": "Dodaj", + "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)", + "search": "Pretraživanje", + "additionalOptsFor": "Dodatne opcije za {}", + "supportedSources": "Podržani izvori", + "trackOnlyInBrackets": "(Samo za praćenje)", + "searchableInBrackets": "(Može se pretraživati)", + "appsString": "Aplikacije", + "noApps": "Nema aplikacija", + "noAppsForFilter": "Nema aplikacija za filter", + "byX": "Autor {}", + "percentProgress": "Napredak: {}%", + "pleaseWait": "Molimo sačekajte", + "updateAvailable": "Ažuriranje dostupno", + "estimateInBracketsShort": "(Procjena)", + "notInstalled": "Nije instalirano", + "estimateInBrackets": "(Procjena)", + "selectAll": "Označi sve", + "deselectN": "Poništi odabir {}", + "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.", + "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?", + "removeSelectedApps": "Ukloni odabrane aplikacije", + "updateX": "Nadogradi {}", + "installX": "Instaliraj {}", + "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano", + "changeX": "Promjena {}", + "installUpdateApps": "Instalirajte/ažurirajte aplikacije", + "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije", + "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?", + "no": "Ne", + "yes": "Da", + "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane", + "pinToTop": "Prikvači na vrh", + "unpinFromTop": "Otkvači sa vrha", + "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?", + "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.", + "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija", + "resetInstallStatus": "Resetujte status instalacije", + "more": "Više", + "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", + "showOutdatedOnly": "Prikaži samo zastarjele aplikacije", + "filter": "Filtriranje", + "filterActive": "Filtriranje", + "filterApps": "Filtriraj aplikacije", + "appName": "Naziv aplikacije", + "author": "Autor", + "upToDateApps": "Ažurirane aplikacije", + "nonInstalledApps": "Neinstalirane aplikacije", + "importExport": "Uvoz/izvoz", + "settings": "Postavke", + "exportedTo": "Izvezeno u {}", + "obtainiumExport": "Obtainium Export", + "invalidInput": "Neispravan unos.", + "importedX": "Uvezeno {}", + "obtainiumImport": "Obtainium uvoz", + "importFromURLList": "Uvoz iz URL liste", + "searchQuery": "Pretraga za: ", + "appURLList": "Lista URL adresa aplikacija", + "line": "Linija", + "searchX": "Pretraživanje {}", + "noResults": "Nema rezultata", + "importX": "Uvoz {}", + "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.", + "importErrors": "Uvezi greške", + "importedXOfYApps": "{} od {} aplikacija uvezeno.", + "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:", + "okay": "Dobro", + "selectURL": "Odaberite URL", + "selectURLs": "Odaberite URL-ove", + "pick": "Odaberi", + "theme": "Tema", + "dark": "Tamna", + "light": "Svijetla", + "followSystem": "Pratite sistem", "obtainium": "Obtainium", - "materialYou": "Material You", - "useBlackTheme": "Koristite čisto crnu tamnu temu", - "appSortBy": "Aplikacije sortirane po", - "authorName": "Autor/Ime", - "nameAuthor": "Ime/Autor", - "asAdded": "Kao što je dodano", - "appSortOrder": "Redoslijed sortiranja aplikacija", - "ascending": "Uzlazno", - "descending": "Silazno", - "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini", - "neverManualOnly": "Nikada - samo ručno", - "appearance": "Izgled", - "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije", - "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija", - "updates": "Nadogradnje", - "sourceSpecific": "Specifično za izvor", - "appSource": "Izvor aplikacije", - "noLogs": "Nema evidencije", - "appLogs": "Evidencije aplikacija", - "close": "Zatvori", - "share": "Podijeli", - "appNotFound": "Aplikacija nije pronađena", - "obtainiumExportHyphenatedLowercase": "obtainium-export", - "pickAnAPK": "Odaberite APK", - "appHasMoreThanOnePackage": "{} ima više od jednog paketa:", - "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.", - "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:", - "warning": "Upozorenje", - "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?", - "updatesAvailable": "Dostupna ažuriranja", - "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium", - "noNewUpdates": "Nema novih ažuriranja.", - "xHasAnUpdate": "{} ima ažuriranje.", - "appsUpdated": "Aplikacije su ažurirane", - "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", - "xWasUpdatedToY": "{} je ažuriran na {}.", - "errorCheckingUpdates": "Greška pri provjeri ažuriranja", - "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", - "appsRemoved": "Aplikacije su uklonjene", - "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja", - "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}", - "completeAppInstallation": "Dovršite instalaciju aplikacije", - "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija", - "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije", - "checkingForUpdates": "Tražim moguće nadogradnje", - "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja", - "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije", - "trackOnly": "Samo za praćenje", - "errorWithHttpStatusCode": "Greška {}", - "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", - "unknown": "Nepoznato", - "none": "Ništa", - "never": "Nikad", - "latestVersionX": "Najnovija verzija: {}", - "installedVersionX": "Instalirana verzija: {}", - "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}", - "remove": "Izbriši", - "yesMarkUpdated": "Da, označi kao ažurirano", - "fdroid": "F-Droid Official", - "appIdOrName": "ID ili ime aplikacije", - "appId": "Apl ID", - "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom", - "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija", - "fdroidThirdPartyRepo": "F-Droid Repo treće strane", - "steam": "Steam", - "steamMobile": "Steam Mobile", - "steamChat": "Razgovor na Steamu (chat)", - "install": "Instaliraj", - "markInstalled": "Označi kao instalirano", - "update": "Nadogradi", - "markUpdated": "Označi kao ažurirano", - "additionalOptions": "Dodatne opcije", - "disableVersionDetection": "Onemogući detekciju verzije", - "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", - "downloadingX": "Preuzimanje {}", - "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", - "noAPKFound": "APK nije pronađen", - "noVersionDetection": "Nema detekcije verzije", - "categorize": "Kategoriziraj", - "categories": "Kategorije", - "category": "Kategorija", - "noCategory": "Nema kategorije", - "noCategories": "Nema kategorija", - "deleteCategoriesQuestion": "Želite li izbrisati kategorije?", - "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.", - "addCategory": "Dodaj kategoriju", - "label": "Oznaka", - "language": "Jezik", - "copiedToClipboard": "Podaci kopirani u međuspremnik", - "storagePermissionDenied": "Dozvola za pohranu je odbijena", - "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.", - "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu", - "removeFromObtainium": "Ukloni iz Obtainiuma", - "uninstallFromDevice": "Deinstaliraj s uređaja", - "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.", - "releaseDateAsVersion": "Koristi datum izdanja kao verziju", - "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.", - "changes": "Promjene", - "releaseDate": "Datum izdavanja", - "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)", - "versionDetection": "Otkrivanje verzije", - "standardVersionDetection": "Detekcija standardne verzije", - "groupByCategory": "Grupiši po kategoriji", - "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće", - "overrideSource": "Premosti izvor", - "dontShowAgain": "Ne prikazuj ovo ponovo", - "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)", - "about": "O nama", - "requiresCredentialsInSettings": "Za ovo su potrebni dodatni akreditivi (u Postavkama)", - "checkOnStart": "Provjerite ima li novosti pri pokretanju", - "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda", - "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije", - "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a", - "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije", - "disablePageTransitions": "Ugasite animaciju prijelaza stranice", - "reversePageTransitions": "Reverzne animacije prijelaza stranice", - "minStarCount": "Minimum Star Count", - "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.", - "sortByFileNamesNotLinks": "Sort by file names instead of full links", - "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", - "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", - "appsPossiblyUpdated": "App Updates Attempted", - "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", - "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", - "enableBackgroundUpdates": "Enable background updates", - "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", - "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", - "verifyLatestTag": "Verify the 'latest' tag", - "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", - "intermediateLinkNotFound": "Intermediate link not found", - "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", - "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", - "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "materialYou": "Material You", + "useBlackTheme": "Koristite čisto crnu tamnu temu", + "appSortBy": "Aplikacije sortirane po", + "authorName": "Autor/Ime", + "nameAuthor": "Ime/Autor", + "asAdded": "Kao što je dodano", + "appSortOrder": "Redoslijed sortiranja aplikacija", + "ascending": "Uzlazno", + "descending": "Silazno", + "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini", + "neverManualOnly": "Nikada - samo ručno", + "appearance": "Izgled", + "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije", + "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija", + "updates": "Nadogradnje", + "sourceSpecific": "Specifično za izvor", + "appSource": "Izvor aplikacije", + "noLogs": "Nema evidencije", + "appLogs": "Evidencije aplikacija", + "close": "Zatvori", + "share": "Podijeli", + "appNotFound": "Aplikacija nije pronađena", + "obtainiumExportHyphenatedLowercase": "obtainium-export", + "pickAnAPK": "Odaberite APK", + "appHasMoreThanOnePackage": "{} ima više od jednog paketa:", + "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.", + "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:", + "warning": "Upozorenje", + "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?", + "updatesAvailable": "Dostupna ažuriranja", + "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium", + "noNewUpdates": "Nema novih ažuriranja.", + "xHasAnUpdate": "{} ima ažuriranje.", + "appsUpdated": "Aplikacije su ažurirane", + "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", + "xWasUpdatedToY": "{} je ažuriran na {}.", + "errorCheckingUpdates": "Greška pri provjeri ažuriranja", + "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", + "appsRemoved": "Aplikacije su uklonjene", + "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja", + "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}", + "completeAppInstallation": "Dovršite instalaciju aplikacije", + "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija", + "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije", + "checkingForUpdates": "Tražim moguće nadogradnje", + "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja", + "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije", + "trackOnly": "Samo za praćenje", + "errorWithHttpStatusCode": "Greška {}", + "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", + "unknown": "Nepoznato", + "none": "Ništa", + "never": "Nikad", + "latestVersionX": "Najnovija verzija: {}", + "installedVersionX": "Instalirana verzija: {}", + "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}", + "remove": "Izbriši", + "yesMarkUpdated": "Da, označi kao ažurirano", + "fdroid": "F-Droid Official", + "appIdOrName": "ID ili ime aplikacije", + "appId": "Apl ID", + "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom", + "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija", + "fdroidThirdPartyRepo": "F-Droid Repo treće strane", + "steam": "Steam", + "steamMobile": "Steam Mobile", + "steamChat": "Razgovor na Steamu (chat)", + "install": "Instaliraj", + "markInstalled": "Označi kao instalirano", + "update": "Nadogradi", + "markUpdated": "Označi kao ažurirano", + "additionalOptions": "Dodatne opcije", + "disableVersionDetection": "Onemogući detekciju verzije", + "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", + "downloadingX": "Preuzimanje {}", + "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", + "noAPKFound": "APK nije pronađen", + "noVersionDetection": "Nema detekcije verzije", + "categorize": "Kategoriziraj", + "categories": "Kategorije", + "category": "Kategorija", + "noCategory": "Nema kategorije", + "noCategories": "Nema kategorija", + "deleteCategoriesQuestion": "Želite li izbrisati kategorije?", + "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.", + "addCategory": "Dodaj kategoriju", + "label": "Oznaka", + "language": "Jezik", + "copiedToClipboard": "Podaci kopirani u međuspremnik", + "storagePermissionDenied": "Dozvola za pohranu je odbijena", + "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.", + "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu", + "removeFromObtainium": "Ukloni iz Obtainiuma", + "uninstallFromDevice": "Deinstaliraj s uređaja", + "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.", + "releaseDateAsVersion": "Koristi datum izdanja kao verziju", + "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.", + "changes": "Promjene", + "releaseDate": "Datum izdavanja", + "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)", + "versionDetection": "Otkrivanje verzije", + "standardVersionDetection": "Detekcija standardne verzije", + "groupByCategory": "Grupiši po kategoriji", + "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće", + "overrideSource": "Premosti izvor", + "dontShowAgain": "Ne prikazuj ovo ponovo", + "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)", + "about": "O nama", + "requiresCredentialsInSettings": "Za ovo su potrebni dodatni akreditivi (u Postavkama)", + "checkOnStart": "Provjerite ima li novosti pri pokretanju", + "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda", + "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije", + "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a", + "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije", + "disablePageTransitions": "Ugasite animaciju prijelaza stranice", + "reversePageTransitions": "Reverzne animacije prijelaza stranice", + "minStarCount": "Minimum Star Count", + "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.", + "sortByFileNamesNotLinks": "Sort by file names instead of full links", + "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", + "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", + "appsPossiblyUpdated": "App Updates Attempted", + "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", + "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", + "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", + "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", + "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", + "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", + "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", + "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", + "versionExtractionRegEx": "Version Extraction RegEx", + "matchGroupToUse": "Match Group to Use", + "highlightTouchTargets": "Highlight less obvious touch targets", + "pickExportDir": "Pick Export Directory", + "autoExportOnChanges": "Auto-export on changes", + "filterVersionsByRegEx": "Filter Versions by Regular Expression", + "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", + "dontSortReleasesList": "Retain release order from API", + "reverseSort": "Reverse sorting", + "debugMenu": "Debug Menu", + "bgTaskStarted": "Background task started - check logs.", + "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", - "removeAppQuestion": { - "one": "Želite li ukloniti aplikaciju?", - "other": "Želite li ukloniti aplikacije?" - }, - "tooManyRequestsTryAgainInMinutes": { - "one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu", - "other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min." - }, - "bgUpdateGotErrorRetryInMinutes": { - "one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu", - "other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min." - }, - "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno", - "other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno" - }, - "apps": { - "one": "{} aplikacija", - "other": "{} aplikacije" - }, - "url": { - "one": "{} URL", - "other": "{} URL-ovi" - }, - "minute": { - "one": "{} minuta", - "other": "min." - }, - "hour": { - "one": "{} sat", - "other": "{} sat/i" - }, - "day": { - "one": "{} dan", - "other": "{} dana" - }, - "clearedNLogsBeforeXAfterY": { - "one": "Izbrisan {n} log (prije = {before}, nakon = {after})", - "other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})" - }, - "xAndNMoreUpdatesAvailable": { - "one": "{} i još 1 aplikacija ima ažuriranja.", - "other": "{} i još {} aplikacija imaju ažuriranja." - }, - "xAndNMoreUpdatesInstalled": { - "one": "{} i još 1 aplikacija je ažurirana.", - "other": "{} i još {} aplikacija je ažurirano." - }, - "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} and 1 more app may have been updated.", - "other": "{} and {} more apps may have been updated." - } + "updatesAvailableNotifChannel": "Dostupna ažuriranja", + "appsUpdatedNotifChannel": "Aplikacije su ažurirane", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Greška pri provjeri ažuriranja", + "appsRemovedNotifChannel": "Aplikacije su uklonjene", + "downloadingXNotifChannel": "Preuzimanje {}", + "completeAppInstallationNotifChannel": "Dovršite instalaciju aplikacije", + "checkingForUpdatesNotifChannel": "Tražim moguće nadogradnje", + "removeAppQuestion": { + "one": "Želite li ukloniti aplikaciju?", + "other": "Želite li ukloniti aplikacije?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu", + "other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min." + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu", + "other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min." + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno", + "other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno" + }, + "apps": { + "one": "{} aplikacija", + "other": "{} aplikacije" + }, + "url": { + "one": "{} URL", + "other": "{} URL-ovi" + }, + "minute": { + "one": "{} minuta", + "other": "min." + }, + "hour": { + "one": "{} sat", + "other": "{} sat/i" + }, + "day": { + "one": "{} dan", + "other": "{} dana" + }, + "clearedNLogsBeforeXAfterY": { + "one": "Izbrisan {n} log (prije = {before}, nakon = {after})", + "other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "{} i još 1 aplikacija ima ažuriranja.", + "other": "{} i još {} aplikacija imaju ažuriranja." + }, + "xAndNMoreUpdatesInstalled": { + "one": "{} i još 1 aplikacija je ažurirana.", + "other": "{} i još {} aplikacija je ažurirano." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} and 1 more app may have been updated.", + "other": "{} and {} more apps may have been updated." + } } diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 2f6ea78..df3be45 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -25,7 +25,7 @@ "githubStarredRepos": "GitHub Starred Repos", "uname": "username", "wrongArgNum": "Špatný počet předložených argumentů", - "xIsTrackOnly":"{} je určeno pouze pro sledování", + "xIsTrackOnly": "{} je určeno pouze pro sledování", "source": "zdroj", "app": "App", "appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou 'Jen sledovány'.", @@ -56,7 +56,7 @@ "estimateInBrackets": "(přibližně)", "selectAll": "Vybrat Vše", "deselectN": "{} deselected", - "xWillBeRemovedButRemainInstalled":"{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.", + "xWillBeRemovedButRemainInstalled": "{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.", "removeSelectedAppsQuestion": "Odebrat vybrané aplikace?", "removeSelectedApps": "Odebrat vybrané aplikace", "updateX": "Aktualizovat {}", @@ -101,7 +101,7 @@ "importX": "Import {}", "importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako \"Neinstalované\". Chcete-li to opravit, nainstalujte je znovu prostřednictvím Obtainium. To nemá vliv na data aplikací. Ovlivňuje pouze metody importu URL a třetích stran.", "importErrors": "Import Errors", - "importedXOfYApps":"{}importováno {}aplikací.", + "importedXOfYApps": "{}importováno {}aplikací.", "followingURLsHadErrors": "U následujících adres URL došlo k chybám:", "okay": "Okay", "selectURL": "Select URL", @@ -136,7 +136,7 @@ "appNotFound": "App not found", "obtainiumExportHyphenatedLowercase": "obtainium-export", "pickAnAPK": "Vybrat APK", - "appHasMoreThanOnePackage":"{} má více než jeden balíček:", + "appHasMoreThanOnePackage": "{} má více než jeden balíček:", "deviceSupportsXArch": "Vaše zařízení podporuje architekturu CPU {}.", "deviceSupportsFollowingArchs": "Vaše zařízení podporuje následující architektury CPU:", "warning": "Varování", @@ -144,15 +144,15 @@ "updatesAvailable": "dostupné aktualizace", "updatesAvailableNotifDescription": "Upozorňuje uživatele, že jsou k dispozici aktualizace pro jednu nebo více aplikací sledovaných Obtainium", "noNewUpdates": "Žádné nové aktualizace.", - "xHasAnUpdate":"{} má aktualizaci.", + "xHasAnUpdate": "{} má aktualizaci.", "appsUpdated": "Aplikace aktualizovány", "appsUpdatedNotifDescription": "Upozorňuje uživatele, že byly provedeny aktualizace jedné nebo více aplikací na pozadí", - "xWasUpdatedToY":"{} byl aktualizován na {}", + "xWasUpdatedToY": "{} byl aktualizován na {}", "errorCheckingUpdates": "Chybová kontrola aktualizací", "errorCheckingUpdatesNotifDescription": "Oznámení zobrazené při neúspěšné kontrole aktualizací na pozadí", "appsRemoved": "Odstraněné aplikace", "appsRemovedNotifDescription": "Oznámení uživateli, že jedna nebo více aplikací byly odstraněny z důvodu chyb při načítání", - "xWasRemovedDueToErrorY":"{} byla odstraněna z důvodu následující chyby: {}", + "xWasRemovedDueToErrorY": "{} byla odstraněna z důvodu následující chyby: {}", "completeAppInstallation": "Dokončit instalaci aplikace", "obtainiumMustBeOpenToInstallApps": "Obtainium musí být otevřeno, aby bylo možné instalovat aplikace", "completeAppInstallationNotifDescription": "Vyzvat uživatele k návratu do Obtainium pro dokončení instalace aplikací", @@ -241,7 +241,7 @@ "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')", "appsPossiblyUpdated": "Byly provedeny pokusy o aktualizaci aplikací", "appsPossiblyUpdatedNotifDescription": "Upozorňuje uživatele, že na pozadí mohly být provedeny aktualizace jedné nebo více aplikací", - "xWasPossiblyUpdatedToY":"{} mohlo být aktualizováno na {}.", + "xWasPossiblyUpdatedToY": "{} mohlo být aktualizováno na {}.", "enableBackgroundUpdates": "Povolit aktualizace na pozadí", "backgroundUpdateReqsExplanation": "Aktualizace na pozadí nemusí být možné pro všechny aplikace.", "backgroundUpdateLimitsExplanation": "Úspěšnost instalace na pozadí lze určit pouze v případě, že je otevřen Obtainium.", @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "dostupné aktualizace", + "appsUpdatedNotifChannel": "Aplikace aktualizovány", + "appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizaci aplikací", + "errorCheckingUpdatesNotifChannel": "Chybová kontrola aktualizací", + "appsRemovedNotifChannel": "Odstraněné aplikace", + "downloadingXNotifChannel": "download {}", + "completeAppInstallationNotifChannel": "Dokončit instalaci aplikace", + "checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" @@ -283,15 +291,15 @@ "other": "Kontrola aktualizací na pozadí našla {} aktualizací - v případě potřeby upozorní uživatele" }, "apps": { - "one":"{} App", - "other":"{} apps" + "one": "{} App", + "other": "{} apps" }, "url": { "jedna": "{} URL", "other": "{} URLs" }, "minute": { - "one":"{} minute", + "one": "{} minute", "other": "{} minutes" }, "hour": { @@ -303,20 +311,19 @@ "other": "{} dny" }, "clearedNLogsBeforeXAfterY": { - "one":"{n} log vymazán (před = {před}, po = {po})", + "one": "{n} log vymazán (před = {před}, po = {po})", "other": "{n} logů vymazáno (před = {před}, po = {po})" }, "xAndNMoreUpdatesAvailable": { - "one":"{} a 1 další aplikace mají aktualizace.", - "other":"{} a {} další aplikace mají aktualizace." + "one": "{} a 1 další aplikace mají aktualizace.", + "other": "{} a {} další aplikace mají aktualizace." }, "xAndNMoreUpdatesInstalled": { - "one":"{} a {} další aplikace mají aktualizace.", - "další":"{} a {} další aplikace byly aktualizovány." + "one": "{} a {} další aplikace mají aktualizace.", + "další": "{} a {} další aplikace byly aktualizovány." }, "xAndNMoreUpdatesPossiblyInstalled": { - "one":"{} a {} další aplikace byly možná aktualizovány", - "other":"{} a {} další aplikace mohly být aktualizovány." + "one": "{} a {} další aplikace byly možná aktualizovány", + "other": "{} a {} další aplikace mohly být aktualizovány." } -} - +} \ No newline at end of file diff --git a/assets/translations/de.json b/assets/translations/de.json index fe2a44d..90fbdc6 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Aktualisierungen verfügbar", + "appsUpdatedNotifChannel": "Apps aktualisiert", + "appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht", + "errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen", + "appsRemovedNotifChannel": "Apps entfernt", + "downloadingXNotifChannel": "Lade {} herunter", + "completeAppInstallationNotifChannel": "App Installation abschließen", + "checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" @@ -318,4 +326,4 @@ "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." } -} +} \ No newline at end of file diff --git a/assets/translations/en.json b/assets/translations/en.json index 3d68d57..6d8311c 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Updates Available", + "appsUpdatedNotifChannel": "Apps Updated", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Error Checking for Updates", + "appsRemovedNotifChannel": "Apps Removed", + "downloadingXNotifChannel": "Downloading {}", + "completeAppInstallationNotifChannel": "Complete App Installation", + "checkingForUpdatesNotifChannel": "Checking for Updates", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" @@ -318,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/es.json b/assets/translations/es.json index 3003f67..a73970b 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Actualizaciones Disponibles", + "appsUpdatedNotifChannel": "Aplicaciones Actualizadas", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Error Buscando Actualizaciones", + "appsRemovedNotifChannel": "Aplicaciones Eliminadas", + "downloadingXNotifChannel": "Descargando {}", + "completeAppInstallationNotifChannel": "Instalación Completa de la Aplicación", + "checkingForUpdatesNotifChannel": "Buscando Actualizaciones", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" @@ -318,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 7c24b96..f051b48 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "بروزرسانی در دسترس ", + "appsUpdatedNotifChannel": "برنامه ها به روز شدند", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "خطا در بررسی به‌روزرسانی‌ها", + "appsRemovedNotifChannel": "برنامه ها حذف شدند", + "downloadingXNotifChannel": "در حال دانلود {}", + "completeAppInstallationNotifChannel": "نصب کامل برنامه", + "checkingForUpdatesNotifChannel": "بررسی به‌روزرسانی‌ها", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" @@ -318,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 2eb17dc..649b0ff 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Mises à jour disponibles", + "appsUpdatedNotifChannel": "Applications mises à jour", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour", + "appsRemovedNotifChannel": "Applications supprimées", + "downloadingXNotifChannel": "Téléchargement {}", + "completeAppInstallationNotifChannel": "Installation complète de l'application", + "checkingForUpdatesNotifChannel": "Vérification des mises à jour", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" @@ -318,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/hu.json b/assets/translations/hu.json index b94b173..b41dfb4 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -1,321 +1,329 @@ -{ - "invalidURLForSource": "Érvénytelen a(z) {} app URL-je", - "noReleaseFound": "Nem található megfelelő kiadás", - "noVersionFound": "Nem sikerült meghatározni a kiadás verzióját", - "urlMatchesNoSource": "Az URL nem egyezik ismert forrással", - "cantInstallOlderVersion": "Nem telepíthető egy app régebbi verziója", - "appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő app azonosítóval", - "functionNotImplemented": "Ez az osztály nem valósította meg ezt a függvényt", - "placeholder": "Helykitöltő", - "someErrors": "Néhány hiba történt", - "unexpectedError": "Váratlan hiba", - "ok": "Oké", - "and": "és", - "githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)", - "includePrereleases": "Tartalmazza az előzetes kiadásokat", - "fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz", - "filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel", - "invalidRegEx": "Érvénytelen reguláris kifejezés", - "noDescription": "Nincs leírás", - "cancel": "Mégse", - "continue": "Tovább", - "requiredInBrackets": "(Kötelező)", - "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", - "colour": "Szín", - "githubStarredRepos": "GitHub Csillagos Repo-k", - "uname": "Felh.név", - "wrongArgNum": "Rossz számú argumentumot adott meg", - "xIsTrackOnly": "A(z) {} csak nyomonkövethető", - "source": "Forrás", - "app": "App", - "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.", - "youPickedTrackOnly": "A 'Csak követés' opciót választotta.", - "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", - "cancelled": "Törölve", - "appAlreadyAdded": "Az app már hozzáadva", - "alreadyUpToDateQuestion": "Az app már naprakész?", - "addApp": "App hozzáadás", - "appSourceURL": "App forrás URL", - "error": "Hiba", - "add": "Hozzáadás", - "searchSomeSourcesLabel": "Keresés (csak egyes források)", - "search": "Keresés", - "additionalOptsFor": "További lehetőségek a következőhöz: {}", - "supportedSources": "Támogatott források", - "trackOnlyInBrackets": "(Csak nyomonkövetés)", - "searchableInBrackets": "(Kereshető)", - "appsString": "Appok", - "noApps": "Nincs App", - "noAppsForFilter": "Nincsenek appok a szűrőhöz", - "byX": "Fejlesztő: {}", - "percentProgress": "Folyamat: {}%", - "pleaseWait": "Kis türelmet", - "updateAvailable": "Frissítés érhető el", - "estimateInBracketsShort": "(Becsült)", - "notInstalled": "Nem telepített", - "estimateInBrackets": "(Becslés)", - "selectAll": "Mindet kiválaszt", - "deselectN": "Törölje {} kijelölését", - "xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.", - "removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?", - "removeSelectedApps": "Távolítsa el a kiválasztott appokat", - "updateX": "Frissítés: {}", - "installX": "Telepítés: {}", - "markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített", - "changeX": "Változás {}", - "installUpdateApps": "Appok telepítése/frissítése", - "installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat", - "markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?", - "no": "Nem", - "yes": "Igen", - "markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként", - "pinToTop": "Rögzítés felülre", - "unpinFromTop": "Eltávolít felülről", - "resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?", - "installStatusOfXWillBeResetExplanation": "A kiválasztott appok telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített app verzió hibás, frissítések vagy egyéb problémák miatt.", - "shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit", - "resetInstallStatus": "Telepítési állapot visszaállítása", - "more": "További", - "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ő", - "upToDateApps": "Naprakész appok", - "nonInstalledApps": "Nem telepített appok", - "importExport": "Import/Export", - "settings": "Beállítások", - "exportedTo": "Exportálva ide {}", - "obtainiumExport": "Obtainium Adat Exportálás", - "invalidInput": "Hibás bemenet", - "importedX": "Importálva innen {}", - "obtainiumImport": "Obtainium Adat Importálás", - "importFromURLList": "Importálás URL listából", - "searchQuery": "Keresési lekérdezés", - "appURLList": "App URL lista", - "line": "Sor", - "searchX": "Keresés {}", - "noResults": "Nincs találat", - "importX": "Import {}", - "importedAppsIdDisclaimer": "Előfordulhat, hogy az importált appok helytelenül \"Nincs telepítve\" jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak az URL-ekre és a harmadik féltől származó importálási módszerekre vonatkozik..", - "importErrors": "Importálási hibák", - "importedXOfYApps": "{}/{} app importálva.", - "followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:", - "okay": "Oké", - "selectURL": "Válassza ki az URL-t", - "selectURLs": "Kiválasztott URL-ek", - "pick": "Válasszon", - "theme": "Téma", - "dark": "Sötét", - "light": "Világos", - "followSystem": "Rendszer szerint", - "obtainium": "Obtainium", - "materialYou": "Material You", - "useBlackTheme": "Használjon tiszta fekete sötét témát", - "appSortBy": "App rendezés...", - "authorName": "Szerző/Név", - "nameAuthor": "Név/Szerző", - "asAdded": "Mint Hozzáadott", - "appSortOrder": "Appok rendezése", - "ascending": "Emelkedő", - "descending": "Csökkenő", - "bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze", - "neverManualOnly": "Soha – csak manuális", - "appearance": "Megjelenés", - "showWebInAppView": "Forrás megjelenítése az Appok nézetben", - "pinUpdates": "Frissítések kitűzése az App nézet tetejére", - "updates": "Frissítések", - "sourceSpecific": "Forrás-specifikus", - "appSource": "App forrás", - "noLogs": "Nincsenek naplók", - "appLogs": "App naplók", - "close": "Bezárás", - "share": "Megosztás", - "appNotFound": "App nem található", - "obtainiumExportHyphenatedLowercase": "obtainium-export", - "pickAnAPK": "Válasszon egy APK-t", - "appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:", - "deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.", - "deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:", - "warning": "Figyelem", - "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?", - "updatesAvailable": "Frissítések érhetők el", - "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy frissítések állnak rendelkezésre egy vagy több, az Obtainium által nyomon követett alkalmazáshoz", - "noNewUpdates": "Nincsenek új frissítések.", - "xHasAnUpdate": "A(z) {} frissítést kapott.", - "appsUpdated": "Alkalmazások frissítve", - "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", - "xWasUpdatedToY": "{} frissítve a következőre: {}.", - "errorCheckingUpdates": "Hiba a frissítések keresésekor", - "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", - "appsRemoved": "Alkalmazások eltávolítva", - "appsRemovedNotifDescription": "Értesíti a felhasználót egy vagy több alkalmazás eltávolításáról a betöltésük során fellépő hibák miatt", - "xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}", - "completeAppInstallation": "Teljes app telepítés", - "obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez", - "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", - "checkingForUpdates": "Frissítések keresése", - "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg", - "pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését", - "trackOnly": "Csak követés", - "errorWithHttpStatusCode": "Hiba {}", - "versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)", - "unknown": "Ismeretlen", - "none": "Egyik sem", - "never": "Soha", - "latestVersionX": "Legújabb verzió: {}", - "installedVersionX": "Telepített verzió: {}", - "lastUpdateCheckX": "Frissítés ellenőrizve: {}", - "remove": "Eltávolítás", - "yesMarkUpdated": "Igen, megjelölés frissítettként", - "fdroid": "F-Droid Official", - "appIdOrName": "App ID vagy név", - "appId": "App ID", - "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", - "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", - "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", - "steam": "Steam", - "steamMobile": "Steam Mobile", - "steamChat": "Steam Chat", - "install": "Telepít", - "markInstalled": "Telepítettnek jelöl", - "update": "Frissít", - "markUpdated": "Frissítettnek jelöl", - "additionalOptions": "További lehetőségek", - "disableVersionDetection": "Verzió érzékelés letiltása", - "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", - "downloadingX": "{} letöltés", - "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", - "noAPKFound": "Nem található APK", - "noVersionDetection": "Nincs verzió érzékelés", - "categorize": "Kategorizálás", - "categories": "Kategóriák", - "category": "Kategória", - "noCategory": "Nincs kategória", - "noCategories": "No Categories", - "deleteCategoryQuestion": "Törli a kategóriát?", - "categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", - "addCategory": "Új kategória", - "label": "Címke", - "language": "Nyelv", - "copiedToClipboard": "Másolva a vágólapra", - "storagePermissionDenied": "Tárhely engedély megtagadva", - "selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.", - "filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel", - "removeFromObtainium": "Eltávolítás az Obtainiumból", - "uninstallFromDevice": "Eltávolítás a készülékről", - "onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.", - "releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót", - "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió érzékelése nem működik megfelelően, de elérhető a kiadás dátuma.", - "changes": "Változtatások", - "releaseDate": "Kiadás dátuma", - "importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)", - "versionDetection": "Verzió érzékelés", - "standardVersionDetection": "Alapért. verzió érzékelés", - "groupByCategory": "Csoportosítás Kategória alapján", - "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-okat", - "overrideSource": "Forrás felülbírálása", - "dontShowAgain": "Ne mutassa ezt újra", - "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)", - "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", - "tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból", - "removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása", - "pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", - "checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor", - "disablePageTransitions": "Lap áttűnési animációk letiltása", - "reversePageTransitions": "Fordított lap áttűnési animációk", - "minStarCount": "Minimális csillag szám", - "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.", - "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", - "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$')", - "appsPossiblyUpdated": "App frissítési kísérlet", - "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", - "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", - "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", - "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", - "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", - "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", - "intermediateLinkNotFound": "Intermediate link not found", - "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", - "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", - "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", - "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", - "matchGroupToUse": "Párosítsa a csoportot a használathoz", - "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", - "pickExportDir": "Válassza az Exportálási könyvtárat", - "autoExportOnChanges": "Auto-exportálás a változások után", - "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel", - "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", - "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése", - "reverseSort": "Fordított rendezés", - "debugMenu": "Hibakereső menü", - "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", - "enableBackgroundUpdates": "Frissítések a háttérben", - "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", - "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", - "installing": "Installing", - "skipUpdateNotifications": "Skip update notifications", - "removeAppQuestion": { - "one": "Eltávolítja az alkalmazást?", - "other": "Eltávolítja az alkalmazást?" - }, - "tooManyRequestsTryAgainInMinutes": { - "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", - "other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva" - }, - "bgUpdateGotErrorRetryInMinutes": { - "one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást", - "other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást" - }, - "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót", - "other": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót" - }, - "apps": { - "one": "{} app", - "other": "{} app" - }, - "url": { - "one": "{} URL", - "other": "{} URL" - }, - "minute": { - "one": "{} perc", - "other": "{} perc" - }, - "hour": { - "one": "{} óra", - "other": "{} óra" - }, - "day": { - "one": "{} nap", - "other": "{} nap" - }, - "clearedNLogsBeforeXAfterY": { - "one": "{n} napló törölve (előtte = {előtte}, utána = {utána})", - "other": "{n} napló törölve (előtte = {előtte}, utána = {utána})" - }, - "xAndNMoreUpdatesAvailable": { - "one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.", - "other": "{} és {} további alkalmazás frissítéseket kapott." - }, - "xAndNMoreUpdatesInstalled": { - "one": "A(z) {} és 1 további alkalmazás frissítve.", - "other": "{} és {} további alkalmazás frissítve." - }, - "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} és 1 további alkalmazás is frissült.", - "other": "{} és {} további alkalmazás is frissült." - } -} +{ + "invalidURLForSource": "Érvénytelen a(z) {} app URL-je", + "noReleaseFound": "Nem található megfelelő kiadás", + "noVersionFound": "Nem sikerült meghatározni a kiadás verzióját", + "urlMatchesNoSource": "Az URL nem egyezik ismert forrással", + "cantInstallOlderVersion": "Nem telepíthető egy app régebbi verziója", + "appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő app azonosítóval", + "functionNotImplemented": "Ez az osztály nem valósította meg ezt a függvényt", + "placeholder": "Helykitöltő", + "someErrors": "Néhány hiba történt", + "unexpectedError": "Váratlan hiba", + "ok": "Oké", + "and": "és", + "githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)", + "includePrereleases": "Tartalmazza az előzetes kiadásokat", + "fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz", + "filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel", + "invalidRegEx": "Érvénytelen reguláris kifejezés", + "noDescription": "Nincs leírás", + "cancel": "Mégse", + "continue": "Tovább", + "requiredInBrackets": "(Kötelező)", + "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", + "colour": "Szín", + "githubStarredRepos": "GitHub Csillagos Repo-k", + "uname": "Felh.név", + "wrongArgNum": "Rossz számú argumentumot adott meg", + "xIsTrackOnly": "A(z) {} csak nyomonkövethető", + "source": "Forrás", + "app": "App", + "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.", + "youPickedTrackOnly": "A 'Csak követés' opciót választotta.", + "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", + "cancelled": "Törölve", + "appAlreadyAdded": "Az app már hozzáadva", + "alreadyUpToDateQuestion": "Az app már naprakész?", + "addApp": "App hozzáadás", + "appSourceURL": "App forrás URL", + "error": "Hiba", + "add": "Hozzáadás", + "searchSomeSourcesLabel": "Keresés (csak egyes források)", + "search": "Keresés", + "additionalOptsFor": "További lehetőségek a következőhöz: {}", + "supportedSources": "Támogatott források", + "trackOnlyInBrackets": "(Csak nyomonkövetés)", + "searchableInBrackets": "(Kereshető)", + "appsString": "Appok", + "noApps": "Nincs App", + "noAppsForFilter": "Nincsenek appok a szűrőhöz", + "byX": "Fejlesztő: {}", + "percentProgress": "Folyamat: {}%", + "pleaseWait": "Kis türelmet", + "updateAvailable": "Frissítés érhető el", + "estimateInBracketsShort": "(Becsült)", + "notInstalled": "Nem telepített", + "estimateInBrackets": "(Becslés)", + "selectAll": "Mindet kiválaszt", + "deselectN": "Törölje {} kijelölését", + "xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.", + "removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?", + "removeSelectedApps": "Távolítsa el a kiválasztott appokat", + "updateX": "Frissítés: {}", + "installX": "Telepítés: {}", + "markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített", + "changeX": "Változás {}", + "installUpdateApps": "Appok telepítése/frissítése", + "installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat", + "markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?", + "no": "Nem", + "yes": "Igen", + "markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként", + "pinToTop": "Rögzítés felülre", + "unpinFromTop": "Eltávolít felülről", + "resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?", + "installStatusOfXWillBeResetExplanation": "A kiválasztott appok telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített app verzió hibás, frissítések vagy egyéb problémák miatt.", + "shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit", + "resetInstallStatus": "Telepítési állapot visszaállítása", + "more": "További", + "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ő", + "upToDateApps": "Naprakész appok", + "nonInstalledApps": "Nem telepített appok", + "importExport": "Import/Export", + "settings": "Beállítások", + "exportedTo": "Exportálva ide {}", + "obtainiumExport": "Obtainium Adat Exportálás", + "invalidInput": "Hibás bemenet", + "importedX": "Importálva innen {}", + "obtainiumImport": "Obtainium Adat Importálás", + "importFromURLList": "Importálás URL listából", + "searchQuery": "Keresési lekérdezés", + "appURLList": "App URL lista", + "line": "Sor", + "searchX": "Keresés {}", + "noResults": "Nincs találat", + "importX": "Import {}", + "importedAppsIdDisclaimer": "Előfordulhat, hogy az importált appok helytelenül \"Nincs telepítve\" jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak az URL-ekre és a harmadik féltől származó importálási módszerekre vonatkozik..", + "importErrors": "Importálási hibák", + "importedXOfYApps": "{}/{} app importálva.", + "followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:", + "okay": "Oké", + "selectURL": "Válassza ki az URL-t", + "selectURLs": "Kiválasztott URL-ek", + "pick": "Válasszon", + "theme": "Téma", + "dark": "Sötét", + "light": "Világos", + "followSystem": "Rendszer szerint", + "obtainium": "Obtainium", + "materialYou": "Material You", + "useBlackTheme": "Használjon tiszta fekete sötét témát", + "appSortBy": "App rendezés...", + "authorName": "Szerző/Név", + "nameAuthor": "Név/Szerző", + "asAdded": "Mint Hozzáadott", + "appSortOrder": "Appok rendezése", + "ascending": "Emelkedő", + "descending": "Csökkenő", + "bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze", + "neverManualOnly": "Soha – csak manuális", + "appearance": "Megjelenés", + "showWebInAppView": "Forrás megjelenítése az Appok nézetben", + "pinUpdates": "Frissítések kitűzése az App nézet tetejére", + "updates": "Frissítések", + "sourceSpecific": "Forrás-specifikus", + "appSource": "App forrás", + "noLogs": "Nincsenek naplók", + "appLogs": "App naplók", + "close": "Bezárás", + "share": "Megosztás", + "appNotFound": "App nem található", + "obtainiumExportHyphenatedLowercase": "obtainium-export", + "pickAnAPK": "Válasszon egy APK-t", + "appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:", + "deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.", + "deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:", + "warning": "Figyelem", + "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?", + "updatesAvailable": "Frissítések érhetők el", + "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy frissítések állnak rendelkezésre egy vagy több, az Obtainium által nyomon követett alkalmazáshoz", + "noNewUpdates": "Nincsenek új frissítések.", + "xHasAnUpdate": "A(z) {} frissítést kapott.", + "appsUpdated": "Alkalmazások frissítve", + "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", + "xWasUpdatedToY": "{} frissítve a következőre: {}.", + "errorCheckingUpdates": "Hiba a frissítések keresésekor", + "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", + "appsRemoved": "Alkalmazások eltávolítva", + "appsRemovedNotifDescription": "Értesíti a felhasználót egy vagy több alkalmazás eltávolításáról a betöltésük során fellépő hibák miatt", + "xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}", + "completeAppInstallation": "Teljes app telepítés", + "obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez", + "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", + "checkingForUpdates": "Frissítések keresése", + "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg", + "pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését", + "trackOnly": "Csak követés", + "errorWithHttpStatusCode": "Hiba {}", + "versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)", + "unknown": "Ismeretlen", + "none": "Egyik sem", + "never": "Soha", + "latestVersionX": "Legújabb verzió: {}", + "installedVersionX": "Telepített verzió: {}", + "lastUpdateCheckX": "Frissítés ellenőrizve: {}", + "remove": "Eltávolítás", + "yesMarkUpdated": "Igen, megjelölés frissítettként", + "fdroid": "F-Droid Official", + "appIdOrName": "App ID vagy név", + "appId": "App ID", + "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", + "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", + "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", + "steam": "Steam", + "steamMobile": "Steam Mobile", + "steamChat": "Steam Chat", + "install": "Telepít", + "markInstalled": "Telepítettnek jelöl", + "update": "Frissít", + "markUpdated": "Frissítettnek jelöl", + "additionalOptions": "További lehetőségek", + "disableVersionDetection": "Verzió érzékelés letiltása", + "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", + "downloadingX": "{} letöltés", + "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", + "noAPKFound": "Nem található APK", + "noVersionDetection": "Nincs verzió érzékelés", + "categorize": "Kategorizálás", + "categories": "Kategóriák", + "category": "Kategória", + "noCategory": "Nincs kategória", + "noCategories": "No Categories", + "deleteCategoryQuestion": "Törli a kategóriát?", + "categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", + "addCategory": "Új kategória", + "label": "Címke", + "language": "Nyelv", + "copiedToClipboard": "Másolva a vágólapra", + "storagePermissionDenied": "Tárhely engedély megtagadva", + "selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.", + "filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel", + "removeFromObtainium": "Eltávolítás az Obtainiumból", + "uninstallFromDevice": "Eltávolítás a készülékről", + "onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.", + "releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót", + "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió érzékelése nem működik megfelelően, de elérhető a kiadás dátuma.", + "changes": "Változtatások", + "releaseDate": "Kiadás dátuma", + "importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)", + "versionDetection": "Verzió érzékelés", + "standardVersionDetection": "Alapért. verzió érzékelés", + "groupByCategory": "Csoportosítás Kategória alapján", + "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-okat", + "overrideSource": "Forrás felülbírálása", + "dontShowAgain": "Ne mutassa ezt újra", + "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)", + "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", + "tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból", + "removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása", + "pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", + "checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor", + "disablePageTransitions": "Lap áttűnési animációk letiltása", + "reversePageTransitions": "Fordított lap áttűnési animációk", + "minStarCount": "Minimális csillag szám", + "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.", + "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", + "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$')", + "appsPossiblyUpdated": "App frissítési kísérlet", + "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", + "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", + "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", + "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", + "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", + "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", + "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", + "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", + "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", + "matchGroupToUse": "Párosítsa a csoportot a használathoz", + "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", + "pickExportDir": "Válassza az Exportálási könyvtárat", + "autoExportOnChanges": "Auto-exportálás a változások után", + "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel", + "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", + "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése", + "reverseSort": "Fordított rendezés", + "debugMenu": "Hibakereső menü", + "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", + "enableBackgroundUpdates": "Frissítések a háttérben", + "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Frissítések érhetők el", + "appsUpdatedNotifChannel": "Alkalmazások frissítve", + "appsPossiblyUpdatedNotifChannel": "App frissítési kísérlet", + "errorCheckingUpdatesNotifChannel": "Hiba a frissítések keresésekor", + "appsRemovedNotifChannel": "Alkalmazások eltávolítva", + "downloadingXNotifChannel": "{} letöltés", + "completeAppInstallationNotifChannel": "Teljes app telepítés", + "checkingForUpdatesNotifChannel": "Frissítések keresése", + "removeAppQuestion": { + "one": "Eltávolítja az alkalmazást?", + "other": "Eltávolítja az alkalmazást?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", + "other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást", + "other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást" + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót", + "other": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót" + }, + "apps": { + "one": "{} app", + "other": "{} app" + }, + "url": { + "one": "{} URL", + "other": "{} URL" + }, + "minute": { + "one": "{} perc", + "other": "{} perc" + }, + "hour": { + "one": "{} óra", + "other": "{} óra" + }, + "day": { + "one": "{} nap", + "other": "{} nap" + }, + "clearedNLogsBeforeXAfterY": { + "one": "{n} napló törölve (előtte = {előtte}, utána = {utána})", + "other": "{n} napló törölve (előtte = {előtte}, utána = {utána})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.", + "other": "{} és {} további alkalmazás frissítéseket kapott." + }, + "xAndNMoreUpdatesInstalled": { + "one": "A(z) {} és 1 további alkalmazás frissítve.", + "other": "{} és {} további alkalmazás frissítve." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} és 1 további alkalmazás is frissült.", + "other": "{} és {} további alkalmazás is frissült." + } +} \ No newline at end of file diff --git a/assets/translations/it.json b/assets/translations/it.json index 10ce3f3..8ec4682 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Aggiornamenti disponibili", + "appsUpdatedNotifChannel": "App aggiornate", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Controllo degli errori per gli aggiornamenti", + "appsRemovedNotifChannel": "App rimosse", + "downloadingXNotifChannel": "Scaricamento di {} in corso", + "completeAppInstallationNotifChannel": "Completa l'installazione dell'app", + "checkingForUpdatesNotifChannel": "Controllo degli aggiornamenti in corso", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" @@ -318,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/ja.json b/assets/translations/ja.json index c1edaf5..596669d 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "アップデートが利用可能", + "appsUpdatedNotifChannel": "アプリをアップデートしました", + "appsPossiblyUpdatedNotifChannel": "アプリのアップデートを試行", + "errorCheckingUpdatesNotifChannel": "アップデート確認中のエラー", + "appsRemovedNotifChannel": "削除されたアプリ", + "downloadingXNotifChannel": "{} をダウンロード中", + "completeAppInstallationNotifChannel": "アプリのインストールを完了する", + "checkingForUpdatesNotifChannel": "アップデートを確認中", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" @@ -318,4 +326,4 @@ "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" } -} +} \ No newline at end of file diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 72278c3..184255a 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -16,7 +16,7 @@ "fallbackToOlderReleases": "Powracaj do starszych wersji", "filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych", "invalidRegEx": "Nieprawidłowe wyrażenie regularne", - "noDescription": "Brak opisu", + "noDescription": "Brak opisu", "cancel": "Anuluj", "continue": "Kontynuuj", "requiredInBrackets": "(Wymagane)", @@ -66,7 +66,7 @@ "installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", "markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?", - "no": "Nie", + "no": "Nie", "yes": "Tak", "markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane", "pinToTop": "Przypnij", @@ -172,7 +172,7 @@ "yesMarkUpdated": "Tak, oznacz jako zaktualizowane", "fdroid": "Oficjalny F-Droid", "appIdOrName": "ID aplikacji lub nazwa", - "appId": "ID aplikacji", + "appId": "ID aplikacji", "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", @@ -243,14 +243,14 @@ "appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji", "xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.", "enableBackgroundUpdates": "Włącz aktualizacje w tle", - "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", + "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", "intermediateLinkNotFound": "Nie znaleziono linku pośredniego", "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", - "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", + "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", "versionExtractionRegEx": "Wyrażenie regularne wyodrębniające wersję", "matchGroupToUse": "Dopasuj grupę do użycia", "highlightTouchTargets": "Wyróżnij mniej oczywiste elementy dotykowe", @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Dostępne aktualizacje", + "appsUpdatedNotifChannel": "Zaktualizowane aplikacje", + "appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji", + "errorCheckingUpdatesNotifChannel": "Sprawdzanie błędów aktualizacji", + "appsRemovedNotifChannel": "Usunięte aplikacje", + "downloadingXNotifChannel": "Pobieranie {}", + "completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji", + "checkingForUpdatesNotifChannel": "Sprawdzanie aktualizacji", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", @@ -276,9 +284,9 @@ "one": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minutę", "few": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty", "many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut", - "other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty" + "other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty" }, - "bgUpdateGotErrorRetryInMinutes": { + "bgUpdateGotErrorRetryInMinutes": { "one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę", "few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty", "many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut", diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 31ff890..1eaaec3 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Atualizações Disponíveis", + "appsUpdatedNotifChannel": "Apps Atualizados", + "appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de Apps", + "errorCheckingUpdatesNotifChannel": "Erro ao Procurar por Atualizações", + "appsRemovedNotifChannel": "Apps Removidos", + "downloadingXNotifChannel": "Baixando {}", + "completeAppInstallationNotifChannel": "Instalação completa do App", + "checkingForUpdatesNotifChannel": "Checando por Atualizações", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" @@ -318,4 +326,4 @@ "one": "{} e 1 outro app pode ter sido atualizado.", "other": "{} e {} outros apps podem ter sido atualizados." } -} +} \ No newline at end of file diff --git a/assets/translations/ru.json b/assets/translations/ru.json index 9628df3..f4cf61a 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Доступны обновления", + "appsUpdatedNotifChannel": "Приложения обновлены", + "appsPossiblyUpdatedNotifChannel": "Попытки обновления приложений", + "errorCheckingUpdatesNotifChannel": "Ошибка при проверке обновлений", + "appsRemovedNotifChannel": "Приложение удалено", + "downloadingXNotifChannel": "Загрузка {}", + "completeAppInstallationNotifChannel": "Завершение установки приложения", + "checkingForUpdatesNotifChannel": "Проверка обновлений", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" @@ -318,4 +326,4 @@ "one": "{} и ещё 1 приложение могли быть обновлены.", "other": "{} и ещё {} приложений могли быть обновлены." } -} +} \ No newline at end of file diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 609aff5..b6580ce 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -266,6 +266,14 @@ "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", "installing": "Installing", "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "更新可用", + "appsUpdatedNotifChannel": "应用已更新", + "appsPossiblyUpdatedNotifChannel": "已尝试更新应用", + "errorCheckingUpdatesNotifChannel": "检查更新出错", + "appsRemovedNotifChannel": "应用已删除", + "downloadingXNotifChannel": "正在下载{}", + "completeAppInstallationNotifChannel": "完成应用安装", + "checkingForUpdatesNotifChannel": "正在检查更新", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" @@ -318,4 +326,4 @@ "one": "{} 和另外 1 个应用已尝试更新。", "other": "{} 和另外 {} 个应用已尝试更新。" } -} +} \ No newline at end of file diff --git a/lib/providers/notifications_provider.dart b/lib/providers/notifications_provider.dart index 452512a..851fb18 100644 --- a/lib/providers/notifications_provider.dart +++ b/lib/providers/notifications_provider.dart @@ -28,7 +28,7 @@ class UpdateNotification extends ObtainiumNotification { tr('updatesAvailable'), '', 'UPDATES_AVAILABLE', - tr('updatesAvailable'), + tr('updatesAvailableNotifChannel'), tr('updatesAvailableNotifDescription'), Importance.max) { message = updates.isEmpty @@ -42,8 +42,14 @@ class UpdateNotification extends ObtainiumNotification { class SilentUpdateNotification extends ObtainiumNotification { SilentUpdateNotification(List updates, {int? id}) - : super(id ?? 3, tr('appsUpdated'), '', 'APPS_UPDATED', tr('appsUpdated'), - tr('appsUpdatedNotifDescription'), Importance.defaultImportance) { + : super( + id ?? 3, + tr('appsUpdated'), + '', + 'APPS_UPDATED', + tr('appsUpdatedNotifChannel'), + tr('appsUpdatedNotifDescription'), + Importance.defaultImportance) { message = updates.length == 1 ? tr('xWasUpdatedToY', args: [updates[0].finalName, updates[0].latestVersion]) @@ -59,7 +65,7 @@ class SilentUpdateAttemptNotification extends ObtainiumNotification { tr('appsPossiblyUpdated'), '', 'APPS_POSSIBLY_UPDATED', - tr('appsPossiblyUpdated'), + tr('appsPossiblyUpdatedNotifChannel'), tr('appsPossiblyUpdatedNotifDescription'), Importance.defaultImportance) { message = updates.length == 1 @@ -77,15 +83,21 @@ class ErrorCheckingUpdatesNotification extends ObtainiumNotification { tr('errorCheckingUpdates'), error, 'BG_UPDATE_CHECK_ERROR', - tr('errorCheckingUpdates'), + tr('errorCheckingUpdatesNotifChannel'), tr('errorCheckingUpdatesNotifDescription'), Importance.high); } class AppsRemovedNotification extends ObtainiumNotification { AppsRemovedNotification(List> namedReasons) - : super(6, tr('appsRemoved'), '', 'APPS_REMOVED', tr('appsRemoved'), - tr('appsRemovedNotifDescription'), Importance.max) { + : super( + 6, + tr('appsRemoved'), + '', + 'APPS_REMOVED', + tr('appsRemovedNotifChannel'), + tr('appsRemovedNotifDescription'), + Importance.max) { message = ''; for (var r in namedReasons) { message += '${tr('xWasRemovedDueToErrorY', args: [r[0], r[1]])} \n'; @@ -101,7 +113,7 @@ class DownloadNotification extends ObtainiumNotification { tr('downloadingX', args: [appName]), '', 'APP_DOWNLOADING', - tr('downloadingX', args: [tr('app')]), + tr('downloadingXNotifChannel', args: [tr('app')]), tr('downloadNotifDescription'), Importance.low, onlyAlertOnce: true, @@ -113,7 +125,7 @@ final completeInstallationNotification = ObtainiumNotification( tr('completeAppInstallation'), tr('obtainiumMustBeOpenToInstallApps'), 'COMPLETE_INSTALL', - tr('completeAppInstallation'), + tr('completeAppInstallationNotifChannel'), tr('completeAppInstallationNotifDescription'), Importance.max); @@ -124,7 +136,7 @@ class CheckingUpdatesNotification extends ObtainiumNotification { tr('checkingForUpdates'), appName, 'BG_UPDATE_CHECK', - tr('checkingForUpdates'), + tr('checkingForUpdatesNotifChannel'), tr('checkingForUpdatesNotifDescription'), Importance.min); } From 67b56cee50bdcd7fe31675315d242b5ca479e724 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 12 Oct 2023 19:51:55 -0400 Subject: [PATCH 85/85] Upgrade packages, increment version --- lib/main.dart | 2 +- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index bb0ac3a..4088f9b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.26'; +const String currentVersion = '0.14.27'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/pubspec.lock b/pubspec.lock index a51aef1..3ea4961 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -142,10 +142,10 @@ packages: dependency: transitive description: name: cross_file - sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" url: "https://pub.dev" source: hosted - version: "0.3.3+5" + version: "0.3.3+6" crypto: dependency: transitive description: @@ -238,10 +238,10 @@ packages: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" file_picker: dependency: "direct main" description: @@ -658,10 +658,10 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: @@ -682,10 +682,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_storage: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index a860b55..be36743 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: 0.14.26+218 # When changing this, update the tag in main() accordingly +version: 0.14.27+219 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0'