mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-26 11:13:46 +01:00 
			
		
		
		
	Compare commits
	
		
			14 Commits
		
	
	
		
			v1.2.5
			...
			d21feaaf74
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | d21feaaf74 | ||
|  | c0c0e2a5c5 | ||
|  | 60e7bba5d9 | ||
|  | 6654406c81 | ||
|  | f5cbbfcace | ||
|  | 8bdc0f8d12 | ||
|  | a980b00600 | ||
|  | 7a385843f9 | ||
|  | 7cb9ca128b | ||
|  | ced7b13777 | ||
|  | 41f37f6d32 | ||
|  | fef0120732 | ||
|  | 6830eb64d0 | ||
|  | b4506c4c3f | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.flutter
									
									
									
									
									
								
							 Submodule .flutter updated: d693b4b9db...9f455d2486
									
								
							| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "هذا الإشعار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)", | ||||
|     "excludeSecrets": "استبعاد الأسرار", | ||||
|     "GHReqPrefix": "مثيل \"sky22333/hubproxy\" لطلبات GitHub", | ||||
|     "includeZips": "تضمين ملفات ZIP", | ||||
|     "zippedApkFilterRegEx": "تصفية ملفات APK داخل ZIP", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "إزالة التطبيق؟", | ||||
|         "other": "إزالة التطبيقات؟" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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": "برنامه ها حذف شوند؟" | ||||
|   | ||||
| @@ -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 ?" | ||||
|   | ||||
| @@ -336,7 +336,9 @@ | ||||
|     "foregroundServiceExplanation": "Előtér-szolgáltatás használata a frissítések ellenőrzéséhez (megbízhatóbb, de több energiát fogyaszt)", | ||||
|     "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 kérésekhez", | ||||
|     "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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要です(OSの設定で非表示にできます)。", | ||||
|     "excludeSecrets": "シークレットを除く", | ||||
|     "GHReqPrefix": "GitHub リクエスト用の 'sky22333/hubproxy' インスタンス", | ||||
|     "includeZips": "ZIPファイルを含む", | ||||
|     "zippedApkFilterRegEx": "ZIP内のAPKをフィルタリングする", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "アプリを削除しますか?", | ||||
|         "other": "アプリを削除しますか?" | ||||
|   | ||||
| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "이 알림은 백그라운드 업데이트 확인에 필요합니다(OS 설정에서 숨길 수 있음).", | ||||
|     "excludeSecrets": "비밀 제외", | ||||
|     "GHReqPrefix": "GitHub 요청을 위한 'sky22333/hubproxy' 인스턴스", | ||||
|     "includeZips": "ZIP 파일 포함", | ||||
|     "zippedApkFilterRegEx": "ZIP 내 APK 필터링", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "앱을 제거하시겠습니까?", | ||||
|         "other": "앱을 제거하시겠습니까?" | ||||
|   | ||||
| @@ -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": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?", | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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 há 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?" | ||||
|   | ||||
| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "Это уведомление необходимо для фоновой проверки обновлений (оно может быть скрыто в настройках ОС)", | ||||
|     "excludeSecrets": "Исключить секреты", | ||||
|     "GHReqPrefix": "Экземпляр 'sky22333/hubproxy' для запросов на GitHub", | ||||
|     "includeZips": "Включить ZIP-файлы", | ||||
|     "zippedApkFilterRegEx": "Фильтр APK внутри ZIP", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Удалить приложение?", | ||||
|         "other": "Удалить приложения?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "Це сповіщення необхідне для фонової перевірки оновлень (його можна приховати в налаштуваннях ОС)", | ||||
|     "excludeSecrets": "Виключити секрети", | ||||
|     "GHReqPrefix": "екземпляр 'sky22333/hubproxy' для запитів на GitHub", | ||||
|     "includeZips": "Додайте ZIP-файли", | ||||
|     "zippedApkFilterRegEx": "Фільтруйте APK-файли всередині ZIP", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Видалити застосунок?", | ||||
|         "other": "Видалити застосунки?" | ||||
|   | ||||
| @@ -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?" | ||||
|   | ||||
| @@ -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": "移除應用程式?" | ||||
|   | ||||
| @@ -337,6 +337,8 @@ | ||||
|     "fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)", | ||||
|     "excludeSecrets": "排除机密", | ||||
|     "GHReqPrefix": "用于 GitHub 请求的 \"sky22333/hubproxy \"实例", | ||||
|     "includeZips": "包含 ZIP 文件", | ||||
|     "zippedApkFilterRegEx": "过滤 ZIP 内的 APK", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "是否删除应用?", | ||||
|         "other": "是否删除应用?" | ||||
|   | ||||
| @@ -18,6 +18,7 @@ class GitHub extends AppSource { | ||||
|     appIdInferIsOptional = true; | ||||
|     showReleaseDateAsVersionToggle = true; | ||||
|     this.hostChanged = hostChanged; | ||||
|     allowIncludeZips = true; | ||||
|  | ||||
|     sourceConfigSettingFormItems = [ | ||||
|       GeneratedFormTextField( | ||||
| @@ -53,11 +54,12 @@ class GitHub extends AppSource { | ||||
|         additionalValidators: [ | ||||
|           (value) { | ||||
|             try { | ||||
|               if (Uri.parse( | ||||
|                 'https://${value}/api.github.com', | ||||
|               ).scheme.isNotEmpty) { | ||||
|               if (value != null && Uri.parse(value).scheme.isNotEmpty) { | ||||
|                 throw true; | ||||
|               } | ||||
|               if (value != null) { | ||||
|                 Uri.parse('https://${value}/api.github.com'); | ||||
|               } | ||||
|             } catch (e) { | ||||
|               return tr('invalidInput'); | ||||
|             } | ||||
| @@ -288,6 +290,9 @@ class GitHub extends AppSource { | ||||
|       settingsProvider, | ||||
|     ); | ||||
|     String? creds = sourceConfig['github-creds']; | ||||
|     if ((additionalSettings['GHReqPrefix'] as String? ?? '').isNotEmpty) { | ||||
|       creds = null; | ||||
|     } | ||||
|     if (creds != null) { | ||||
|       var userNameEndIndex = creds.indexOf(':'); | ||||
|       if (userNameEndIndex > 0) { | ||||
| @@ -366,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('?'); | ||||
| @@ -398,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); | ||||
| @@ -538,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 | ||||
|                   .toLowerCase() | ||||
|                   .endsWith('.apk'), | ||||
|             ) | ||||
|             .toList(); | ||||
|         var apkAssetsWithUrls = allAssetsWithUrls.where((element) { | ||||
|           var ext = (element['final_url'] as MapEntry<String, String>).key | ||||
|               .toLowerCase() | ||||
|               .split('.') | ||||
|               .last; | ||||
|           return ext == 'apk' || (includeZips && ext == 'zip'); | ||||
|         }).toList(); | ||||
|  | ||||
|         var filteredApkUrls = filterApks( | ||||
|           apkAssetsWithUrls | ||||
|   | ||||
| @@ -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; | ||||
|           } | ||||
|   | ||||
| @@ -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, | ||||
|                     ), | ||||
|                   ), | ||||
|                 ], | ||||
|               ), | ||||
|   | ||||
| @@ -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,7 +1349,8 @@ class AppsProvider with ChangeNotifier { | ||||
|       MapEntry<String, String>? fileUrl; | ||||
|       var refreshBeforeDownload = | ||||
|           apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true || | ||||
|           apps[id]!.app.apkUrls.first.value == 'placeholder'; | ||||
|           apps[id]!.app.apkUrls.isNotEmpty && | ||||
|               apps[id]!.app.apkUrls.first.value == 'placeholder'; | ||||
|       if (refreshBeforeDownload) { | ||||
|         await checkUpdate(apps[id]!.app.id); | ||||
|       } | ||||
|   | ||||
| @@ -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, | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
|   | ||||
							
								
								
									
										28
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -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: a2608114b1ffdcbc9c120eb71a0e207c71da56202852d4aab8a5e30a82269e74 | ||||
|       sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.12" | ||||
|     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: | ||||
|   | ||||
| @@ -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.5+2321 | ||||
| version: 1.2.7+2323 | ||||
|  | ||||
| environment: | ||||
|   sdk: ^3.8.1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user