Compare commits

...

8 Commits

Author SHA1 Message Date
Imran
d21feaaf74 Merge pull request #2574 from neardaniel-pls/main
Refine Portuguese Translation
2025-10-11 19:27:17 -04:00
Imran
c0c0e2a5c5 Merge pull request #2583 from ImranR98/dev
- Add support for zipped APKs - GitHub/HTML only for now (#983)
- Fix bug: Release asset download box crashing for track-only apps (#2567)
- Fix text alignment in app selection menu (#2577)
2025-10-11 19:26:45 -04:00
Imran Remtulla
60e7bba5d9 Flutter upgrade + increment version 2025-10-11 19:25:55 -04:00
Imran Remtulla
6654406c81 Fix text alignment in app selection menu (#2577) 2025-10-11 18:33:30 -04:00
Imran Remtulla
f5cbbfcace Fix bug: Release asset download box crashing for track-only apps (#2567) 2025-10-11 18:30:54 -04:00
Imran Remtulla
8bdc0f8d12 Add support for zipped APKs - GitHub/HTML only for now (#983) 2025-10-11 18:29:59 -04:00
NearDaniel
a980b00600 Merge branch 'ImranR98:main' into main 2025-09-30 19:02:38 +01:00
Near
7a385843f9 chore(i18n): refine Portuguese translation
This commit updates the Portuguese translation (`pt.json`) to improve consistency and correctness.

The primary change involves replacing most instances of "aplicativo" with "aplicação" to better align with European Portuguese terminology. Other minor grammatical and wording adjustments have also been made throughout the file.
2025-09-29 21:32:03 +01:00
36 changed files with 251 additions and 124 deletions

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "هذا الإشعار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)",
"excludeSecrets": "استبعاد الأسرار",
"GHReqPrefix": "مثيل \"sky22333/hubproxy\" لطلبات GitHub",
"includeZips": "تضمين ملفات ZIP",
"zippedApkFilterRegEx": "تصفية ملفات APK داخل ZIP",
"removeAppQuestion": {
"one": "إزالة التطبيق؟",
"other": "إزالة التطبيقات؟"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "Želite li ukloniti aplikaciju?",
"other": "Želite li ukloniti aplikacije?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Aquesta notificació és necessària per comprovar les actualitzacions en segon pla (la pots ocultar als paràmetres del Sistema Operatiu)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "¿Suprimeixo l'aplicació?",
"other": "¿Suprimeixo les aplicacions?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení systému)",
"excludeSecrets": "Vyloučit tajemství",
"GHReqPrefix": "instance 'sky22333/hubproxy' pro požadavky GitHubu",
"includeZips": "Zahrnout soubory ZIP",
"zippedApkFilterRegEx": "Filtrování souborů APK uvnitř ZIP",
"removeAppQuestion": {
"one": "Odstranit aplikaci?",
"other": "Odstranit aplikace?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Denne meddelelse er nødvendig for baggrundsopdateringskontrol (den kan skjules i OS-indstillingerne).",
"excludeSecrets": "Udeluk hemmeligheder",
"GHReqPrefix": "'sky22333/hubproxy'-instans til GitHub-anmodninger",
"includeZips": "Inkluder ZIP-filer",
"zippedApkFilterRegEx": "Filtrer APK'er inde i ZIP",
"removeAppQuestion": {
"one": "Fjern app?",
"other": "Fjern apps?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Diese Benachrichtigung ist für die Prüfung von Updates im Hintergrund erforderlich (sie kann in den Betriebssystemeinstellungen ausgeblendet werden)",
"excludeSecrets": "Geheimnisse ausschließen",
"GHReqPrefix": "sky22333/hubproxy'-Instanz für GitHub-Anfragen",
"includeZips": "ZIP-Dateien einbeziehen",
"zippedApkFilterRegEx": "APKs in ZIP filtern",
"removeAppQuestion": {
"one": "App entfernen?",
"other": "Apps entfernen?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "Forigi la aplikaĵon?",
"other": "Forigi la aplikaĵojn?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "Remove app?",
"other": "Remove apps?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Esta notificación es necesaria para la comprobación de actualizaciones en segundo plano (puede ocultarse en la configuración del sistema operativo).",
"excludeSecrets": "Excluir secretos",
"GHReqPrefix": "Instancia \"sky22333/hubproxy\" para las solicitudes de GitHub",
"includeZips": "Incluir archivos ZIP",
"zippedApkFilterRegEx": "Filtrar APKs dentro de ZIP",
"removeAppQuestion": {
"one": "¿Eliminar aplicación?",
"other": "¿Eliminar aplicaciones?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "برنامه حذف شود؟",
"other": "برنامه ها حذف شوند؟"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Cette notification est nécessaire pour la vérification des mises à jour en arrière-plan (elle peut être masquée dans les paramètres du système d'exploitation).",
"excludeSecrets": "Exclure les secrets",
"GHReqPrefix": "instance 'sky22333/hubproxy' pour les requêtes GitHub",
"includeZips": "Inclure les fichiers ZIP",
"zippedApkFilterRegEx": "Filtrer les APK à l'intérieur du ZIP",
"removeAppQuestion": {
"one": "Supprimer l'application ?",
"other": "Supprimer les applications ?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Ez az értesítés a háttérben történő frissítésellenőrzéshez szükséges (a rendszer beállításaiban elrejthető).",
"excludeSecrets": "Érzékeny adatok (például: személyes hozzáférési tokenek) kihagyása",
"GHReqPrefix": "„sky22333/hubproxy” példány a GitHub lekérdezéséhez",
"includeZips": "ZIP fájlok belefoglalása",
"zippedApkFilterRegEx": "APK-k szűrése a ZIP-en belül",
"removeAppQuestion": {
"one": "Eltávolítja az alkalmazást?",
"other": "Eltávolítja az alkalmazásokat?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Pemberitahuan ini diperlukan untuk pemeriksaan pembaruan latar belakang (dapat disembunyikan dalam pengaturan OS)",
"excludeSecrets": "Mengecualikan rahasia",
"GHReqPrefix": "Instance 'sky22333/hubproxy' untuk permintaan GitHub",
"includeZips": "Menyertakan file ZIP",
"zippedApkFilterRegEx": "Saring APK di dalam ZIP",
"removeAppQuestion": {
"one": "Hapus aplikasi?",
"other": "Hapus aplikasi?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Questa notifica è necessaria per il controllo degli aggiornamenti in background (può essere nascosta nelle impostazioni del sistema operativo).",
"excludeSecrets": "Escludere i segreti",
"GHReqPrefix": "istanza 'sky22333/hubproxy' per le richieste a GitHub",
"includeZips": "Includere file ZIP",
"zippedApkFilterRegEx": "Filtrare gli APK all'interno dello ZIP",
"removeAppQuestion": {
"one": "Rimuovere l'app?",
"other": "Rimuovere le app?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要ですOSの設定で非表示にできます。",
"excludeSecrets": "シークレットを除く",
"GHReqPrefix": "GitHub リクエスト用の 'sky22333/hubproxy' インスタンス",
"includeZips": "ZIPファイルを含む",
"zippedApkFilterRegEx": "ZIP内のAPKをフィルタリングする",
"removeAppQuestion": {
"one": "アプリを削除しますか?",
"other": "アプリを削除しますか?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "이 알림은 백그라운드 업데이트 확인에 필요합니다(OS 설정에서 숨길 수 있음).",
"excludeSecrets": "비밀 제외",
"GHReqPrefix": "GitHub 요청을 위한 'sky22333/hubproxy' 인스턴스",
"includeZips": "ZIP 파일 포함",
"zippedApkFilterRegEx": "ZIP 내 APK 필터링",
"removeAppQuestion": {
"one": "앱을 제거하시겠습니까?",
"other": "앱을 제거하시겠습니까?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "ആപ്പ് നീക്കം ചെയ്യണോ?",
"other": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Deze melding is nodig voor het controleren van updates op de achtergrond (kan worden verborgen in de OS-instellingen)",
"excludeSecrets": "Geheimen uitsluiten",
"GHReqPrefix": "'sky22333/hubproxy' instantie voor GitHub verzoeken",
"includeZips": "ZIP-bestanden opnemen",
"zippedApkFilterRegEx": "APK's filteren in ZIP",
"removeAppQuestion": {
"one": "App verwijderen?",
"other": "Apps verwijderen?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "To powiadomienie jest wymagane do sprawdzania aktualizacji w tle (można je ukryć w ustawieniach systemu operacyjnego).",
"excludeSecrets": "Wyklucz sekrety",
"GHReqPrefix": "Instancja \"sky22333/hubproxy\" dla żądań GitHub",
"includeZips": "Dołączanie plików ZIP",
"zippedApkFilterRegEx": "Filtrowanie plików APK wewnątrz ZIP",
"removeAppQuestion": {
"one": "Usunąć aplikację?",
"few": "Usunąć aplikacje?",

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Essa notificação é necessária para a verificação de atualizações em segundo plano (ela pode ser ocultada nas configurações do sistema operacional)",
"excludeSecrets": "Excluir segredos",
"GHReqPrefix": "Instância \"sky22333/hubproxy\" para solicitações do GitHub",
"includeZips": "Incluir arquivos ZIP",
"zippedApkFilterRegEx": "Filtrar APKs dentro do ZIP",
"removeAppQuestion": {
"one": "Remover app?",
"other": "Remover apps?"

View File

@@ -3,8 +3,8 @@
"noReleaseFound": "Não foi possível encontrar uma versão adequada",
"noVersionFound": "Não foi possível encontrar uma versão",
"urlMatchesNoSource": "A URL não corresponde a uma fonte conhecida",
"cantInstallOlderVersion": "Não é permitido instalar uma versão anterior de um aplicativo",
"appIdMismatch": "ID do pacote baixado não é igual ao ID do aplicativo instalado",
"cantInstallOlderVersion": "Não é permitido instalar uma versão anterior de uma aplicação",
"appIdMismatch": "O ID do pacote descarregado não é igual ao ID da aplicação instalada",
"functionNotImplemented": "Esta classe não implementou essa função",
"placeholder": "Espaço reservado",
"someErrors": "Alguns erros ocorreram",
@@ -30,15 +30,15 @@
"wrongArgNum": "Número de argumentos errado",
"xIsTrackOnly": "{} é 'Apenas monitorar'",
"source": "Fonte",
"app": "Aplicativo",
"appsFromSourceAreTrackOnly": "Os aplicativos desta fonte são 'Apenas monitorar'.",
"app": "Aplicação",
"appsFromSourceAreTrackOnly": "As aplicações desta fonte são 'Apenas monitorar'.",
"youPickedTrackOnly": "Você selecionou a opção 'Apenas monitorar'.",
"trackOnlyAppDescription": "As atualizações desse aplicativo serão monitoradas, mas o Obtainium não poderá baixá-lo ou instalá-lo.",
"trackOnlyAppDescription": "As atualizações desta aplicação serão monitorizadas, mas o Obtainium não poderá descarregá-la ou instalá-la.",
"cancelled": "Cancelado",
"appAlreadyAdded": "Aplicativo já adicionado",
"alreadyUpToDateQuestion": "Aplicativo já foi atualizado?",
"addApp": "Adicionar aplicativo",
"appSourceURL": "URL de origem do aplicativo",
"appAlreadyAdded": "Aplicação já adicionada",
"alreadyUpToDateQuestion": "Aplicação já foi atualizada?",
"addApp": "Adicionar aplicação",
"appSourceURL": "URL de origem da aplicação",
"error": "Erro",
"add": "Adicionar",
"searchSomeSourcesLabel": "Procurar (apenas algumas fontes)",
@@ -47,9 +47,9 @@
"supportedSources": "Fontes compatíveis",
"trackOnlyInBrackets": "(apenas monitorar)",
"searchableInBrackets": "(pesquisável)",
"appsString": "Aplicativos",
"noApps": "Não há aplicativos",
"noAppsForFilter": "Sem aplicativos para filtrar",
"appsString": "Aplicações",
"noApps": "Não há aplicações",
"noAppsForFilter": "Sem aplicações para filtrar",
"byX": "Por {}",
"percentProgress": "Progresso: {}%",
"pleaseWait": "Por favor, espere",
@@ -59,35 +59,35 @@
"selectAll": "Selecionar todos",
"deselectX": "Deselecionar {}",
"xWillBeRemovedButRemainInstalled": "{} será removido do Obtainium mais permanecerá instalado no dispositivo.",
"removeSelectedAppsQuestion": "Remover aplicativos selecionados?",
"removeSelectedApps": "Remover aplicativos selecionados",
"removeSelectedAppsQuestion": "Remover aplicações selecionadas?",
"removeSelectedApps": "Remover aplicações selecionadas",
"updateX": "Atualizar {}",
"installX": "Instalar {}",
"markXTrackOnlyAsUpdated": "Marcar {}\n(Apenas monitorar)\ncomo Atualizado",
"changeX": "Mudar {}",
"installUpdateApps": "Instalar/Atualizar aplicativos",
"installUpdateSelectedApps": "Instalar/Atualizar aplicativos selecionados",
"markXSelectedAppsAsUpdated": "Marcar {} aplicativos selecionados como atualizados?",
"installUpdateApps": "Instalar/Atualizar aplicações",
"installUpdateSelectedApps": "Instalar/Atualizar aplicações selecionadas",
"markXSelectedAppsAsUpdated": "Marcar {} aplicações selecionadas como atualizadas?",
"no": "Não",
"yes": "Sim",
"markSelectedAppsUpdated": "Marcar aplicativos selecionados como Atualizados",
"markSelectedAppsUpdated": "Marcar aplicações selecionadas como Atualizadas",
"pinToTop": "Fixar no topo",
"unpinFromTop": "Desafixar do topo",
"resetInstallStatusForSelectedAppsQuestion": "Reiniciar status de instalação nos aplicativos selecionados?",
"installStatusOfXWillBeResetExplanation": "O status de instalação de todos os aplicativos selecionados será reiniciado.\n\nIsso pode ajudar quando uma versão de um aplicativo mostrada no Obtainium é incorreta devido a falhas ao atualizar ou outros problemas.",
"resetInstallStatusForSelectedAppsQuestion": "Reiniciar o estado de instalação das aplicações selecionadas?",
"installStatusOfXWillBeResetExplanation": "O estado de instalação de todas as aplicações selecionadas será reiniciado.\n\nIsto pode ajudar quando uma versão de uma aplicação mostrada no Obtainium está incorreta devido a falhas na atualização ou outros problemas.",
"customLinkMessage": "Esses links funcionam em dispositivos com o Obtainium instalado",
"shareAppConfigLinks": "Compartilhar configuração do aplicativo como link HTML",
"shareSelectedAppURLs": "Compartilhar URLs de aplicativos selecionados",
"shareAppConfigLinks": "Partilhar a configuração da aplicação como um link HTML",
"shareSelectedAppURLs": "Partilhar URLs de aplicações selecionadas",
"resetInstallStatus": "Reiniciar status de instalação",
"more": "Mais",
"removeOutdatedFilter": "Remover filtro de aplicativos desatualizados",
"showOutdatedOnly": "Mostrar apenas aplicativos desatualizados",
"removeOutdatedFilter": "Remover filtro de aplicações desatualizadas",
"showOutdatedOnly": "Mostrar apenas aplicações desatualizadas",
"filter": "Filtro",
"filterApps": "Filtrar aplicativos",
"appName": "Nome do aplicativo",
"filterApps": "Filtrar aplicações",
"appName": "Nome da aplicação",
"author": "Autor",
"upToDateApps": "Aplicativos atualizados",
"nonInstalledApps": "Aplicativos não instalados",
"upToDateApps": "Aplicações atualizadas",
"nonInstalledApps": "Aplicações não instaladas",
"importExport": "Importar/Exportar",
"settings": "Configurações",
"exportedTo": "Exportado para {}",
@@ -97,14 +97,14 @@
"obtainiumImport": "Importar dados do Obtainium",
"importFromURLList": "Importar de lista de URLs",
"searchQuery": "Pesquisa",
"appURLList": "Lista de URLs de aplicativos",
"appURLList": "Lista de URLs de aplicações",
"line": "Linha",
"searchX": "Pesquisar na/o {}",
"noResults": "Nenhum resultado encontrado",
"importX": "Importar {}",
"importedAppsIdDisclaimer": "Aplicativos Importados podem ser mostrados incorretamente como \"Não Instalado\".\nPara consertar, reinstale-os usando o Obtainium.\nIsso não deve afetar dados do aplicativo.\n\nAfeta apenas métodos de importação de URL e de terceiros.",
"importedAppsIdDisclaimer": "Aplicações Importadas podem ser mostradas incorretamente como \"Não Instalado\".\nPara corrigir, reinstale-as usando o Obtainium.\nIsto não deve afetar os dados da aplicação.\n\nAfeta apenas os métodos de importação de URL e de terceiros.",
"importErrors": "Erros de importação",
"importedXOfYApps": "{} de {} aplicativos importados.",
"importedXOfYApps": "{} de {} aplicações importadas.",
"followingURLsHadErrors": "As seguintes URLs apresentaram erros:",
"selectURL": "Selecionar URL",
"selectURLs": "Selecionar URLs",
@@ -115,53 +115,53 @@
"followSystem": "Padrão do sistema",
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
"useBlackTheme": "Usar tema preto AMOLED",
"appSortBy": "Classificar aplicativo por",
"appSortBy": "Classificar aplicação por",
"authorName": "Autor/Nome",
"nameAuthor": "Nome/Autor",
"asAdded": "Como adicionado",
"appSortOrder": "Ordem de classificação de aplicativos",
"appSortOrder": "Ordem de classificação das aplicações",
"ascending": "Ascendente",
"descending": "Descendente",
"bgUpdateCheckInterval": "Intervalo de verificação de atualizações em segundo-plano",
"neverManualOnly": "Nunca - apenas manual",
"appearance": "Aparência",
"showWebInAppView": "Mostrar página web do aplicativo em informações do aplicativo",
"pinUpdates": "Fixar atualizações no topo da janela de aplicativos",
"showWebInAppView": "Mostrar a página web da aplicação nas informações da aplicação",
"pinUpdates": "Fixar atualizações no topo da janela das aplicações",
"updates": "Atualizações",
"sourceSpecific": "Token de acesso",
"appSource": "Fonte do aplicativo",
"appSource": "Fonte da aplicação",
"noLogs": "Sem logs",
"appLogs": "Logs do aplicativo",
"appLogs": "Logs da aplicação",
"close": "Fechar",
"share": "Compartilhar",
"appNotFound": "Aplicativo não encontrado",
"appNotFound": "Aplicação não encontrada",
"obtainiumExportHyphenatedLowercase": "exportação de obtainium",
"pickAnAPK": "Selecionar um APK",
"appHasMoreThanOnePackage": "{} tem mais de um pacote:",
"deviceSupportsXArch": "Seu dispositivo suporta a arquitetura de CPU {}.",
"deviceSupportsFollowingArchs": "Seu dispositivo suporta as seguintes arquiteturas de CPU:",
"warning": "Aviso",
"sourceIsXButPackageFromYPrompt": "A fonte do aplicativo é '{}' mas a origem do pacote é '{}'. Continuar?",
"sourceIsXButPackageFromYPrompt": "A fonte da aplicação é '{}' mas a origem do pacote é '{}'. Continuar?",
"updatesAvailable": "Atualizações disponíveis",
"updatesAvailableNotifDescription": "Notifica o usuário quando atualizações de um ou mais aplicativos monitorados pelo Obtainium estão disponíveis",
"updatesAvailableNotifDescription": "Notifica o utilizador quando as atualizações de uma ou mais aplicações monitorizadas pelo Obtainium estão disponíveis",
"noNewUpdates": "Sem novas atualizações.",
"xHasAnUpdate": "{} tem uma atualização.",
"appsUpdated": "Aplicativos atualizados",
"appsUpdated": "Aplicações atualizadas",
"appsNotUpdated": "Falha na atualização das aplicações",
"appsUpdatedNotifDescription": "Notifica o usuário quando atualizações foram aplicadas em segundo-plano para um ou mais aplicativos ",
"appsUpdatedNotifDescription": "Notifica o utilizador quando as atualizações foram aplicadas em segundo plano para uma ou mais aplicações ",
"xWasUpdatedToY": "{} foi atualizado para {}.",
"xWasNotUpdatedToY": "Falha ao atualizar {} para {}.",
"errorCheckingUpdates": "Erro ao procurar por atualizações",
"errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha",
"appsRemoved": "Aplicativos removidos",
"appsRemovedNotifDescription": "Notifica o usuário quando um ou mais aplicativos foram removidos devido a erros de carregamento",
"appsRemoved": "Aplicações removidas",
"appsRemovedNotifDescription": "Notifica o utilizador quando uma ou mais aplicações foram removidas devido a erros de carregamento",
"xWasRemovedDueToErrorY": "{} foi removido devido a este erro: {}",
"completeAppInstallation": "Instalação do aplicativo concluída",
"obtainiumMustBeOpenToInstallApps": "Obtainium deve estar aberto para instalar os aplicativos",
"completeAppInstallationNotifDescription": "Pede ao usuário que retorne ao Obtainium para finalizar a instalação de um aplicativo",
"completeAppInstallation": "Instalação da aplicação concluída",
"obtainiumMustBeOpenToInstallApps": "O Obtainium deve estar aberto para instalar as aplicações",
"completeAppInstallationNotifDescription": "Pede ao usuário que retorne ao Obtainium para finalizar a instalação de uma aplicação",
"checkingForUpdates": "Verificando atualizações",
"checkingForUpdatesNotifDescription": "Notificação transiente que aparece quando o Obtainium está verificando se há atualizações",
"pleaseAllowInstallPerm": "Por favor, permita que o Obtainium possa instalar aplicativos",
"pleaseAllowInstallPerm": "Por favor, permita que o Obtainium instale aplicações",
"trackOnly": "Apenas monitorar",
"errorWithHttpStatusCode": "Erro {}",
"versionCorrectionDisabled": "Correção de versão desativada (plugin parece não funcionar)",
@@ -175,10 +175,10 @@
"remove": "Remover",
"yesMarkUpdated": "Sim, marcar como atualizado",
"fdroid": "Oficial F-Droid",
"appIdOrName": "ID do aplicativo ou nome",
"appId": "ID do aplicativo",
"appWithIdOrNameNotFound": "Nenhum aplicativo foi encontrado com esse ID ou nome",
"reposHaveMultipleApps": "Repositórios podem conter múltiplos aplicativos",
"appIdOrName": "ID da aplicação ou nome",
"appId": "ID da aplicação",
"appWithIdOrNameNotFound": "Nenhuma aplicação foi encontrada com esse ID ou nome",
"reposHaveMultipleApps": "Os repositórios podem conter múltiplas aplicações",
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
"install": "Instalar",
"markInstalled": "Marcar instalado",
@@ -186,12 +186,12 @@
"markUpdated": "Marcar como atualizado",
"additionalOptions": "Opções adicionais",
"disableVersionDetection": "Desativar detecção de versão",
"noVersionDetectionExplanation": "Essa opção deve apenas ser usada por aplicativos onde a detecção de versão não funciona corretamente.",
"noVersionDetectionExplanation": "Esta opção deve ser usada apenas por aplicações onde a deteção de versão não funciona corretamente.",
"downloadingX": "Baixando {}",
"downloadX": "Descarregar {}",
"downloadedX": "Descarregado {}",
"releaseAsset": "Libertação de activos",
"downloadNotifDescription": "Notifica o usuário o progresso do download de um aplicativo",
"downloadNotifDescription": "Notifica o utilizador sobre o progresso do download de uma aplicação",
"noAPKFound": "APK não encontrado",
"noVersionDetection": "Sem detecção de versão",
"categorize": "Categorizar",
@@ -200,20 +200,20 @@
"noCategory": "Sem categoria",
"noCategories": "Sem categorias",
"deleteCategoriesQuestion": "Deletar categorias?",
"categoryDeleteWarning": "Todos os aplicativos em categorias removidas serão descategorizados.",
"categoryDeleteWarning": "Todas as aplicações em categorias removidas serão descategorizadas.",
"addCategory": "Adicionar categoria",
"label": "Etiqueta",
"language": "Linguagem",
"copiedToClipboard": "Copiado para a área de transferência",
"storagePermissionDenied": "Permissão de armazenamento negada",
"selectedCategorizeWarning": "Isso vai substituir qualquer configuração de categoria para os aplicativos selecionados.",
"selectedCategorizeWarning": "Isto irá substituir qualquer configuração de categoria para as aplicações selecionadas.",
"filterAPKsByRegEx": "Filtrar APKs usando expressão regular",
"removeFromObtainium": "Remover do Obtainium",
"uninstallFromDevice": "Desinstalar do dispositivo",
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecção de versão desativada.",
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicações com a deteção de versão desativada.",
"releaseDateAsVersion": "Usar data de lançamento como versão",
"releaseTitleAsVersion": "Utilizar o título da versão como cadeia de versões",
"releaseDateAsVersionExplanation": "Esta opção só deve ser usada para aplicativos onde a detecção de versão não funciona corretamente, mas uma data de lançamento disponível.",
"releaseDateAsVersionExplanation": "Esta opção só deve ser usada para aplicações onde a deteção de versão não funciona corretamente, mas existe uma data de lançamento disponível.",
"changes": "Alterações",
"releaseDate": "Data de lançamento",
"importFromURLsInFile": "Importar de URLs em arquivo (formato OPML)",
@@ -227,15 +227,15 @@
"dontShowAgain": "Não mostrar isso novamente",
"dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'",
"dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK",
"moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos",
"moveNonInstalledAppsToBottom": "Mover aplicações não instaladas para o fundo da lista de aplicações",
"gitlabPATLabel": "Token de acesso pessoal do Gitlab",
"about": "Sobre",
"requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)",
"checkOnStart": "Verificar se há atualizações ao iniciar",
"tryInferAppIdFromCode": "Tente inferir o ID do aplicativo pelo código-fonte",
"removeOnExternalUninstall": "Remover automaticamente aplicativos desinstalados externamente",
"tryInferAppIdFromCode": "Tentar inferir o ID da aplicação a partir do código-fonte",
"removeOnExternalUninstall": "Remover automaticamente aplicações desinstaladas externamente",
"pickHighestVersionCode": "Auto-selecionar o maior número de versão do APK",
"checkUpdateOnDetailPage": "Checar por atualizações ao abrir a página de detalhes de um aplicativo",
"checkUpdateOnDetailPage": "Checar por atualizações ao abrir a página de detalhes de uma aplicação",
"disablePageTransitions": "Desativar animações de transição de página",
"reversePageTransitions": "Animações de transição de página invertidas",
"minStarCount": "Contagem mínima de estrelas",
@@ -245,11 +245,11 @@
"sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link",
"filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex",
"customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')",
"appsPossiblyUpdated": "Tentativas de atualização de aplicativos",
"appsPossiblyUpdatedNotifDescription": "Notifica o usuário de que atualizações de um ou mais aplicativos foram potencialmente aplicadas em segundo-plano",
"appsPossiblyUpdated": "Aplicações possivelmente atualizadas",
"appsPossiblyUpdatedNotifDescription": "Notifica o utilizador de que as atualizações de uma ou mais aplicações foram potencialmente aplicadas em segundo plano",
"xWasPossiblyUpdatedToY": "{} pode ter sido atualizado para {}.",
"enableBackgroundUpdates": "Ativar atualizações em segundo-plano",
"backgroundUpdateReqsExplanation": "Atualizações em segundo-plano podem não ser possíveis para todos os aplicativos.",
"backgroundUpdateReqsExplanation": "As atualizações em segundo plano podem não ser possíveis para todas as aplicações.",
"backgroundUpdateLimitsExplanation": "O sucesso de uma instalação em segundo-plano só pode ser determinado quando o Obtainium é aberto.",
"verifyLatestTag": "Verifique a 'última' etiqueta",
"intermediateLinkRegex": "Filtrar um link 'intermediário' para visitar",
@@ -282,14 +282,14 @@
"installing": "Instalando",
"skipUpdateNotifications": "Pular notificações de update",
"updatesAvailableNotifChannel": "Atualizações disponíveis",
"appsUpdatedNotifChannel": "Aplicativos atualizados",
"appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de aplicativos",
"appsUpdatedNotifChannel": "Aplicações atualizadas",
"appsPossiblyUpdatedNotifChannel": "Aplicações possivelmente atualizadas",
"errorCheckingUpdatesNotifChannel": "Erro ao procurar por atualizações",
"appsRemovedNotifChannel": "Aplicativos removidos",
"appsRemovedNotifChannel": "Aplicações removidas",
"downloadingXNotifChannel": "Baixando {}",
"completeAppInstallationNotifChannel": "Instalação completa do aplicativo",
"completeAppInstallationNotifChannel": "Instalação da aplicação concluída",
"checkingForUpdatesNotifChannel": "Checando por atualizações",
"onlyCheckInstalledOrTrackOnlyApps": "Apenas verificar atualizações de aplicativos instalados e 'Apenas monitorar'",
"onlyCheckInstalledOrTrackOnlyApps": "Apenas verificar atualizações de aplicações instaladas e 'Apenas monitorizar'",
"supportFixedAPKURL": "Suporte a APK com URLs fixas",
"selectX": "Selecionar {}",
"parallelDownloads": "Permitir downloads paralelos",
@@ -299,7 +299,7 @@
"shizukuOldAndroidWithADB": "Shizuku a funcionar no Android < 8.1 com ADB - atualizar o Android ou utilizar o Sui",
"shizukuPretendToBeGooglePlay": "Definir o Google Play como fonte de instalação (se for utilizado o Shizuku)",
"useSystemFont": "Usar fonte padrão do sistema",
"useVersionCodeAsOSVersion": "Usar versionCode do aplicativo como versão detectada pelo sistema operacional",
"useVersionCodeAsOSVersion": "Usar o versionCode da aplicação como a versão detetada pelo sistema operativo",
"requestHeader": "Requisitar cabeçalho",
"useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento",
"defaultPseudoVersioningMethod": "Método de pseudo-versionamento padrão",
@@ -337,6 +337,8 @@
"fgServiceNotice": "Esta notificação é necessária para a verificação de actualizações em segundo plano (pode ser ocultada nas definições do SO)",
"excludeSecrets": "Excluir segredos",
"GHReqPrefix": "Instância 'sky22333/hubproxy' para pedidos de GitHub",
"includeZips": "Incluir ficheiros ZIP",
"zippedApkFilterRegEx": "Filtrar APKs dentro do ZIP",
"removeAppQuestion": {
"one": "Remover aplicação?",
"other": "Remover aplicações?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Это уведомление необходимо для фоновой проверки обновлений (оно может быть скрыто в настройках ОС)",
"excludeSecrets": "Исключить секреты",
"GHReqPrefix": "Экземпляр 'sky22333/hubproxy' для запросов на GitHub",
"includeZips": "Включить ZIP-файлы",
"zippedApkFilterRegEx": "Фильтр APK внутри ZIP",
"removeAppQuestion": {
"one": "Удалить приложение?",
"other": "Удалить приложения?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Detta meddelande krävs för bakgrundsuppdateringskontroll (det kan döljas i OS-inställningarna)",
"excludeSecrets": "Utesluta hemligheter",
"GHReqPrefix": "Instansen \"sky22333/hubproxy\" för GitHub-förfrågningar",
"includeZips": "Inkludera ZIP-filer",
"zippedApkFilterRegEx": "Filtrera APK:er inuti ZIP",
"removeAppQuestion": {
"one": "Ta Bort App?",
"other": "Ta Bort Appar?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Bu bildirim arka planda güncelleme kontrolü için gereklidir (işletim sistemi ayarlarından gizlenebilir)",
"excludeSecrets": "Sırları hariç tut",
"GHReqPrefix": "GitHub istekleri için 'sky22333/hubproxy' örneği",
"includeZips": "ZIP dosyalarını dahil edin",
"zippedApkFilterRegEx": "ZIP içindeki APK'ları filtreleme",
"removeAppQuestion": {
"one": "Uygulamayı Kaldır?",
"other": "Uygulamaları Kaldır?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Це сповіщення необхідне для фонової перевірки оновлень (його можна приховати в налаштуваннях ОС)",
"excludeSecrets": "Виключити секрети",
"GHReqPrefix": "екземпляр 'sky22333/hubproxy' для запитів на GitHub",
"includeZips": "Додайте ZIP-файли",
"zippedApkFilterRegEx": "Фільтруйте APK-файли всередині ZIP",
"removeAppQuestion": {
"one": "Видалити застосунок?",
"other": "Видалити застосунки?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "Thông báo này là bắt buộc để kiểm tra cập nhật nền (có thể ẩn trong cài đặt hệ điều hành).",
"excludeSecrets": "Loại trừ thông tin bí mật",
"GHReqPrefix": "Thực thể 'sky22333/hubproxy' cho các yêu cầu GitHub",
"includeZips": "Ba gồm các tệp ZIP",
"zippedApkFilterRegEx": "Lọc các tệp APK bên trong tệp ZIP",
"removeAppQuestion": {
"one": "Gỡ ứng dụng?",
"other": "Gỡ ứng dụng?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
"excludeSecrets": "Exclude secrets",
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
"includeZips": "Include ZIP files",
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
"removeAppQuestion": {
"one": "移除應用程式?",
"other": "移除應用程式?"

View File

@@ -337,6 +337,8 @@
"fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)",
"excludeSecrets": "排除机密",
"GHReqPrefix": "用于 GitHub 请求的 \"sky22333/hubproxy \"实例",
"includeZips": "包含 ZIP 文件",
"zippedApkFilterRegEx": "过滤 ZIP 内的 APK",
"removeAppQuestion": {
"one": "是否删除应用?",
"other": "是否删除应用?"

View File

@@ -18,6 +18,7 @@ class GitHub extends AppSource {
appIdInferIsOptional = true;
showReleaseDateAsVersionToggle = true;
this.hostChanged = hostChanged;
allowIncludeZips = true;
sourceConfigSettingFormItems = [
GeneratedFormTextField(
@@ -370,6 +371,7 @@ class GitHub extends AppSource {
additionalSettings['useLatestAssetDateAsReleaseDate'] == true;
String sortMethod =
additionalSettings['sortMethodChoice'] ?? 'smartname-datefallback';
bool includeZips = additionalSettings['includeZips'] == true;
dynamic latestRelease;
if (verifyLatestTag) {
var temp = requestUrl.split('?');
@@ -402,7 +404,8 @@ class GitHub extends AppSource {
findReleaseAssetUrls(dynamic release) =>
(release['assets'] as List<dynamic>?)?.map((e) {
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
var ext = e['name'].toString().toLowerCase().split('.').last;
var url = !(ext == 'apk' || (includeZips && ext == 'zip'))
? (e['browser_download_url'] ?? e['url'])
: (e['url'] ?? e['browser_download_url']);
url = undoGHProxyMod(url, sourceConfigSettingValues);
@@ -542,14 +545,13 @@ class GitHub extends AppSource {
List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
.map((e) => e['final_url'] as MapEntry<String, String>)
.toList();
var apkAssetsWithUrls = allAssetsWithUrls
.where(
(element) => (element['final_url'] as MapEntry<String, String>)
.key
var apkAssetsWithUrls = allAssetsWithUrls.where((element) {
var ext = (element['final_url'] as MapEntry<String, String>).key
.toLowerCase()
.endsWith('.apk'),
)
.toList();
.split('.')
.last;
return ext == 'apk' || (includeZips && ext == 'zip');
}).toList();
var filteredApkUrls = filterApks(
apkAssetsWithUrls

View File

@@ -203,11 +203,11 @@ class AddAppPageState extends State<AddAppPage> {
notificationsProvider: notificationsProvider,
);
DownloadedApk? downloadedFile;
DownloadedXApkDir? downloadedDir;
DownloadedDir? downloadedDir;
if (downloadedArtifact is DownloadedApk) {
downloadedFile = downloadedArtifact;
} else {
downloadedDir = downloadedArtifact as DownloadedXApkDir;
downloadedDir = downloadedArtifact as DownloadedDir;
}
app.id = downloadedFile?.appId ?? downloadedDir!.appId;
}

View File

@@ -1010,6 +1010,7 @@ class AppsPageState extends State<AppsPage> {
selectedApps.where((element) => element.pinned).isEmpty
? tr('pinToTop')
: tr('unpinFromTop'),
textAlign: TextAlign.center,
),
),
const Divider(),
@@ -1026,7 +1027,10 @@ class AppsPageState extends State<AppsPage> {
);
Navigator.of(context).pop();
},
child: Text(tr('shareSelectedAppURLs')),
child: Text(
tr('shareSelectedAppURLs'),
textAlign: TextAlign.center,
),
),
const Divider(),
TextButton(
@@ -1043,7 +1047,10 @@ class AppsPageState extends State<AppsPage> {
subject: 'Obtainium - ${tr('appsString')}',
);
},
child: Text(tr('shareAppConfigLinks')),
child: Text(
tr('shareAppConfigLinks'),
textAlign: TextAlign.center,
),
),
const Divider(),
TextButton(
@@ -1069,7 +1076,10 @@ class AppsPageState extends State<AppsPage> {
fileNameOverrides: ['$fn.json'],
);
},
child: Text('${tr('share')} - ${tr('obtainiumExport')}'),
child: Text(
'${tr('share')} - ${tr('obtainiumExport')}',
textAlign: TextAlign.center,
),
),
const Divider(),
TextButton(
@@ -1093,6 +1103,7 @@ class AppsPageState extends State<AppsPage> {
'downloadX',
args: [lowerCaseIfEnglish(tr('releaseAsset'))],
),
textAlign: TextAlign.center,
),
),
const Divider(),
@@ -1100,7 +1111,10 @@ class AppsPageState extends State<AppsPage> {
onPressed: appsProvider.areDownloadsRunning()
? null
: showMassMarkDialog,
child: Text(tr('markSelectedAppsUpdated')),
child: Text(
tr('markSelectedAppsUpdated'),
textAlign: TextAlign.center,
),
),
],
),

View File

@@ -62,11 +62,14 @@ class DownloadedApk {
DownloadedApk(this.appId, this.file);
}
class DownloadedXApkDir {
enum DownloadedDirType { XAPK, ZIP }
class DownloadedDir {
String appId;
File file;
Directory extracted;
DownloadedXApkDir(this.appId, this.file, this.extracted);
DownloadedDirType type;
DownloadedDir(this.appId, this.file, this.extracted, this.type);
}
List<String> generateStandardVersionRegExStrings() {
@@ -664,17 +667,18 @@ class AppsProvider with ChangeNotifier {
}
PackageInfo? newInfo;
var isAPK = downloadedFile.path.toLowerCase().endsWith('.apk');
Directory? xapkDir;
var isXAPK = downloadedFile.path.toLowerCase().endsWith('.xapk');
Directory? apkDir;
if (isAPK) {
newInfo = await pm.getPackageArchiveInfo(
archiveFilePath: downloadedFile.path,
);
} else {
// Assume XAPK
String xapkDirPath = '${downloadedFile.path}-dir';
// Assume XAPK or ZIP
String apkDirPath = '${downloadedFile.path}-dir';
await unzipFile(downloadedFile.path, '${downloadedFile.path}-dir');
xapkDir = Directory(xapkDirPath);
var apks = xapkDir
apkDir = Directory(apkDirPath);
var apks = apkDir
.listSync()
.where((e) => e.path.toLowerCase().endsWith('.apk'))
.toList();
@@ -691,6 +695,22 @@ class AppsProvider with ChangeNotifier {
apks = [temp!, ...apks];
}
if (app.additionalSettings['zippedApkFilterRegEx']?.isNotEmpty ==
true) {
var reg = RegExp(app.additionalSettings['zippedApkFilterRegEx']);
apks.removeWhere((apk) {
var shouldDelete = !reg.hasMatch(apk.uri.pathSegments.last);
if (shouldDelete) {
apk.delete();
}
return shouldDelete;
});
}
if (apks.isEmpty) {
throw NoAPKError();
}
for (var i = 0; i < apks.length; i++) {
try {
newInfo = await pm.getPackageArchiveInfo(
@@ -728,7 +748,12 @@ class AppsProvider with ChangeNotifier {
if (isAPK) {
return DownloadedApk(app.id, downloadedFile);
} else {
return DownloadedXApkDir(app.id, downloadedFile, xapkDir!);
return DownloadedDir(
app.id,
downloadedFile,
apkDir!,
isXAPK ? DownloadedDirType.XAPK : DownloadedDirType.ZIP,
);
}
} finally {
notificationsProvider?.cancel(notifId);
@@ -826,15 +851,16 @@ class AppsProvider with ChangeNotifier {
);
}
Future<bool> installXApkDir(
DownloadedXApkDir dir,
Future<bool> installApkDir(
DownloadedDir dir,
BuildContext? firstTimeWithContext, {
bool needsBGWorkaround = false,
bool shizukuPretendToBeGooglePlay = false,
}) async {
// We don't know which APKs in an XAPK are supported by the user's device
// We don't know which APKs in an XAPK or ZIP are supported by the user's device
// So we try installing all of them and assume success if at least one installed
// If 0 APKs installed, throw the first install error encountered
// Obviously this approach is naive and is undesirable in many cases, needs to be improved
var somethingInstalled = false;
try {
MultiAppMultiError errors = MultiAppMultiError();
@@ -863,7 +889,7 @@ class AppsProvider with ChangeNotifier {
}
try {
await installApk(
var wasInstalled = await installApk(
DownloadedApk(dir.appId, APKFiles[0]),
firstTimeWithContext,
needsBGWorkaround: needsBGWorkaround,
@@ -872,10 +898,10 @@ class AppsProvider with ChangeNotifier {
1,
).map((a) => DownloadedApk(dir.appId, a)).toList(),
);
somethingInstalled = true;
somethingInstalled = somethingInstalled || wasInstalled;
dir.file.delete(recursive: true);
} catch (e) {
logs.add('Could not install APKs from XAPK: ${e.toString()}');
logs.add('Could not install APKs from ${dir.type}: ${e.toString()}');
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
}
if (errors.idsByErrorString.isNotEmpty) {
@@ -1148,7 +1174,7 @@ class AppsProvider with ChangeNotifier {
String id,
bool willBeSilent,
DownloadedApk? downloadedFile,
DownloadedXApkDir? downloadedDir,
DownloadedDir? downloadedDir,
) async {
apps[id]?.downloadProgress = -1;
notifyListeners();
@@ -1183,14 +1209,14 @@ class AppsProvider with ChangeNotifier {
} else {
if (needBGWorkaround) {
// ignore: use_build_context_synchronously
installXApkDir(
installApkDir(
downloadedDir!,
contextIfNewInstall,
needsBGWorkaround: true,
);
} else {
// ignore: use_build_context_synchronously
sayInstalled = await installXApkDir(
sayInstalled = await installApkDir(
downloadedDir!,
contextIfNewInstall,
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
@@ -1227,7 +1253,7 @@ class AppsProvider with ChangeNotifier {
}) async {
bool willBeSilent = false;
DownloadedApk? downloadedFile;
DownloadedXApkDir? downloadedDir;
DownloadedDir? downloadedDir;
try {
var downloadedArtifact =
// ignore: use_build_context_synchronously
@@ -1240,7 +1266,7 @@ class AppsProvider with ChangeNotifier {
if (downloadedArtifact is DownloadedApk) {
downloadedFile = downloadedArtifact;
} else {
downloadedDir = downloadedArtifact as DownloadedXApkDir;
downloadedDir = downloadedArtifact as DownloadedDir;
}
id = downloadedFile?.appId ?? downloadedDir!.appId;
willBeSilent = await canInstallSilently(apps[id]!.app);
@@ -1292,7 +1318,7 @@ class AppsProvider with ChangeNotifier {
res['id'] as String,
res['willBeSilent'] as bool,
res['downloadedFile'] as DownloadedApk?,
res['downloadedDir'] as DownloadedXApkDir?,
res['downloadedDir'] as DownloadedDir?,
);
} catch (e) {
var id = res['id'] as String;
@@ -1323,6 +1349,7 @@ class AppsProvider with ChangeNotifier {
MapEntry<String, String>? fileUrl;
var refreshBeforeDownload =
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true ||
apps[id]!.app.apkUrls.isNotEmpty &&
apps[id]!.app.apkUrls.first.value == 'placeholder';
if (refreshBeforeDownload) {
await checkUpdate(apps[id]!.app.id);

View File

@@ -636,6 +636,7 @@ abstract class AppSource {
bool versionDetectionDisallowed = false;
List<String> excludeCommonSettingKeys = [];
bool urlsAlwaysHaveExtension = false;
bool allowIncludeZips = false;
AppSource() {
name = runtimeType.toString();
@@ -834,7 +835,7 @@ abstract class AppSource {
],
];
// Previous 2 variables combined into one at runtime for convenient usage
// Previous 2 variables combined into one at runtime for convenient usage + additional processing
List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems {
if (showReleaseDateAsVersionToggle == true) {
if (additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly
@@ -878,6 +879,32 @@ abstract class AppSource {
)
.where((e) => e.isNotEmpty)
.toList();
var moreConditionalItems = [];
if (allowIncludeZips) {
moreConditionalItems.addAll([
[
GeneratedFormSwitch(
'includeZips',
label: tr('includeZips'),
defaultValue: false,
),
],
[
GeneratedFormTextField(
'zippedApkFilterRegEx',
label: tr('zippedApkFilterRegEx'),
required: false,
additionalValidators: [
(value) {
return regExValidator(value);
},
],
),
],
]);
}
if (versionDetectionDisallowed) {
overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(
'versionDetection',
@@ -893,6 +920,7 @@ abstract class AppSource {
return [
...additionalSourceAppSpecificSettingFormItems,
...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly,
...moreConditionalItems,
];
}

View File

@@ -40,10 +40,10 @@ packages:
dependency: "direct main"
description:
name: animations
sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb
sha256: a8031b276f0a7986ac907195f10ca7cd04ecf2a8a566bd6dbe03018a9b02b427
url: "https://pub.dev"
source: hosted
version: "2.0.11"
version: "2.1.0"
app_links:
dependency: "direct main"
description:
@@ -482,10 +482,10 @@ packages:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31
sha256: c2fe1001710127dfa7da89977a08d591398370d099aacdaa6d44da7eb14b8476
url: "https://pub.dev"
source: hosted
version: "2.0.30"
version: "2.0.31"
flutter_test:
dependency: transitive
description: flutter
@@ -676,10 +676,10 @@ packages:
dependency: transitive
description:
name: path_provider_android
sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db"
sha256: "3b4c1fc3aa55ddc9cd4aa6759984330d5c8e66aa7702a6223c61540dc6380c37"
url: "https://pub.dev"
source: hosted
version: "2.2.18"
version: "2.2.19"
path_provider_foundation:
dependency: transitive
description:
@@ -852,10 +852,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_android
sha256: bd14436108211b0d4ee5038689a56d4ae3620fd72fd6036e113bf1345bc74d9e
sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713"
url: "https://pub.dev"
source: hosted
version: "2.4.13"
version: "2.4.15"
shared_preferences_foundation:
dependency: transitive
description:
@@ -1059,10 +1059,10 @@ packages:
dependency: transitive
description:
name: url_launcher_android
sha256: "199bc33e746088546a39cc5f36bac5a278c5e53b40cb3196f99e7345fdcfae6b"
sha256: "5c8b6c2d89a78f5a1cca70a73d9d5f86c701b36b42f9c9dac7bad592113c28e9"
url: "https://pub.dev"
source: hosted
version: "6.3.22"
version: "6.3.24"
url_launcher_ios:
dependency: transitive
description:
@@ -1155,10 +1155,10 @@ packages:
dependency: transitive
description:
name: webview_flutter_android
sha256: "3c4eb4fcc252b40c2b5ce7be20d0481428b70f3ff589b0a8b8aaeb64c6bed701"
sha256: e5201c620eb2637dca88a756961fae4a7191bb30b4f2271e08b746405ffdf3fd
url: "https://pub.dev"
source: hosted
version: "4.10.2"
version: "4.10.5"
webview_flutter_platform_interface:
dependency: transitive
description:
@@ -1179,10 +1179,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03"
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
url: "https://pub.dev"
source: hosted
version: "5.14.0"
version: "5.15.0"
win32_registry:
dependency: transitive
description:

View File

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.2.6+2322
version: 1.2.7+2323
environment:
sdk: ^3.8.1