mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-11-04 07:13:28 +01:00 
			
		
		
		
	Compare commits
	
		
			16 Commits
		
	
	
		
			c81c3c5ea7
			...
			dev
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d21feaaf74 | ||
| 
						 | 
					c0c0e2a5c5 | ||
| 
						 | 
					60e7bba5d9 | ||
| 
						 | 
					6654406c81 | ||
| 
						 | 
					f5cbbfcace | ||
| 
						 | 
					8bdc0f8d12 | ||
| 
						 | 
					a980b00600 | ||
| 
						 | 
					7a385843f9 | ||
| 
						 | 
					7cb9ca128b | ||
| 
						 | 
					ced7b13777 | ||
| 
						 | 
					41f37f6d32 | ||
| 
						 | 
					fef0120732 | ||
| 
						 | 
					6830eb64d0 | ||
| 
						 | 
					b4506c4c3f | ||
| 
						 | 
					3af185b0f8 | ||
| 
						 | 
					bfbb2710b6 | 
							
								
								
									
										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
 | 
			
		||||
 
 | 
			
		||||
@@ -146,10 +146,7 @@ Future<List<MapEntry<String, String>>> grabLinksCommon(
 | 
			
		||||
      .map((e) => MapEntry(ensureAbsoluteUrl(e.key, reqUrl), e.value))
 | 
			
		||||
      .toList();
 | 
			
		||||
  if (allLinks.isEmpty || matchLinksOutsideATags) {
 | 
			
		||||
    allLinks = getLinksInLines(rawBody);
 | 
			
		||||
  }
 | 
			
		||||
  if (allLinks.isEmpty) {
 | 
			
		||||
    // Getting desperate
 | 
			
		||||
    // Decode the body if the response is a JSON
 | 
			
		||||
    try {
 | 
			
		||||
      var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(rawBody));
 | 
			
		||||
      allLinks = getLinksInLines(jsonStrings.join('\n'));
 | 
			
		||||
@@ -163,7 +160,7 @@ Future<List<MapEntry<String, String>>> grabLinksCommon(
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      //
 | 
			
		||||
      allLinks = getLinksInLines(rawBody);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  List<MapEntry<String, String>> links = [];
 | 
			
		||||
 
 | 
			
		||||
@@ -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