mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-30 12:30:16 +02:00
Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4017253470 | ||
|
b0b6ddb8fd | ||
|
192b7fc6ce | ||
|
b74dbb973c | ||
|
46ccf8478b | ||
|
9a354ecf0e | ||
|
738dd5649f | ||
|
9f50d8db2d | ||
|
eeb57dbe35 | ||
|
cbcc8c4eaf | ||
|
f4d27c8494 | ||
|
7507e7bf5c | ||
|
783e8029b6 | ||
|
3554257918 |
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Deinstaliraj s uređaja",
|
||||
"onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.",
|
||||
"releaseDateAsVersion": "Koristi datum izdanja kao verziju",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.",
|
||||
"changes": "Promjene",
|
||||
"releaseDate": "Datum izdavanja",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Pomoć/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Konfiguracije aplikacije obezbeđene pomoću velikog broja ljudi (crowdsourcing) (koristite na svoju odgovornost)",
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "Želite li ukloniti aplikaciju?",
|
||||
"other": "Želite li ukloniti aplikacije?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Odinstalovat ze zařízení",
|
||||
"onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.",
|
||||
"releaseDateAsVersion": "Použít datum vydání jako verzi",
|
||||
"releaseTitleAsVersion": "Použít název verze jako řetězec verze",
|
||||
"releaseDateAsVersionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně, ale je k dispozici datum vydání.",
|
||||
"changes": "Změny",
|
||||
"releaseDate": "Datum vydání",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Nápověda/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)",
|
||||
"allowInsecure": "Povolení nezabezpečených požadavků HTTP",
|
||||
"stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější",
|
||||
"removeAppQuestion": {
|
||||
"one": "Odstranit Apku?",
|
||||
"other": "Odstranit Apky?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Afinstaller fra enhed",
|
||||
"onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versionsregistrering deaktiveret.",
|
||||
"releaseDateAsVersion": "Brug udgivelsesdato som versionsstreng",
|
||||
"releaseTitleAsVersion": "Brug udgivelsestitel som versionsstreng",
|
||||
"releaseDateAsVersionExplanation": "Denne indstilling bør kun bruges til apps, hvor versionsregistrering ikke virker korrekt, men hvor en udgivelsesdato er tilgængelig.",
|
||||
"changes": "Ændringer",
|
||||
"releaseDate": "Udgivelsesdato",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Hjælp/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)",
|
||||
"allowInsecure": "Tillad usikre HTTP-anmodninger",
|
||||
"stayOneVersionBehind": "Vær en version bagud i forhold til den nyeste",
|
||||
"removeAppQuestion": {
|
||||
"one": "Fjern app?",
|
||||
"other": "Fjern apps?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Vom Gerät deinstallieren",
|
||||
"onlyWorksWithNonVersionDetectApps": "Funktioniert nur bei Apps mit deaktivierter Versionserkennung.",
|
||||
"releaseDateAsVersion": "Veröffentlichungsdatum als Version verwenden",
|
||||
"releaseTitleAsVersion": "Versionstitel als Versionsstring verwenden",
|
||||
"releaseDateAsVersionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert, aber ein Veröffentlichungsdatum verfügbar ist.",
|
||||
"changes": "Änderungen",
|
||||
"releaseDate": "Veröffentlichungsdatum",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Hilfe/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App-Konfigurationen (Verwendung auf eigene Gefahr)",
|
||||
"allowInsecure": "Unsichere HTTP-Anfragen zulassen",
|
||||
"stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben",
|
||||
"removeAppQuestion": {
|
||||
"one": "App entfernen?",
|
||||
"other": "Apps entfernen?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Malinstali el la disponaĵo",
|
||||
"onlyWorksWithNonVersionDetectApps": "Funkcias nur por apoj kun malaktiva versiodetekto.",
|
||||
"releaseDateAsVersion": "Uzi eldondato kiel versioĉeno",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "Tiu opcio devas esti uzata nur por apoj, por kiu la versiodetekto ne funkcias ĝuste, sed eldondato estas havebla.",
|
||||
"changes": "Modifoj",
|
||||
"releaseDate": "Eldondato",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Helpo/Vikio",
|
||||
"crowdsourcedConfigsLabel": "Komunumaj apo-agordoj (uzu kun singardo)",
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "Forigi la aplikaĵon?",
|
||||
"other": "Forigi la aplikaĵojn?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Uninstall from Device",
|
||||
"onlyWorksWithNonVersionDetectApps": "Only works for Apps with version detection disabled.",
|
||||
"releaseDateAsVersion": "Use release date as version string",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "This option should only be used for Apps where version detection does not work correctly, but a release date is available.",
|
||||
"changes": "Changes",
|
||||
"releaseDate": "Release Date",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Help/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "Remove App?",
|
||||
"other": "Remove Apps?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Desinstalar del dispositivo",
|
||||
"onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.",
|
||||
"releaseDateAsVersion": "Por fecha de publicación",
|
||||
"releaseTitleAsVersion": "Utilizar el título de la versión como cadena de versión",
|
||||
"releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.",
|
||||
"changes": "Cambios",
|
||||
"releaseDate": "Fecha de publicación",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Ayuda/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)",
|
||||
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
||||
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
||||
"removeAppQuestion": {
|
||||
"one": "¿Eliminar aplicación?",
|
||||
"other": "¿Eliminar aplicaciones?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "حذف نصب از دستگاه",
|
||||
"onlyWorksWithNonVersionDetectApps": "فقط برای برنامههایی کار میکند که تشخیص نسخه غیرفعال است.",
|
||||
"releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.",
|
||||
"changes": "تغییرات",
|
||||
"releaseDate": "تاریخ انتشار",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "راهنما/ویکی",
|
||||
"crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)",
|
||||
"allowInsecure": "درخواست های HTTP ناامن را مجاز کنید",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "برنامه حذف شود؟",
|
||||
"other": "برنامه ها حذف شوند؟"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Désinstaller de l'appareil",
|
||||
"onlyWorksWithNonVersionDetectApps": "Ne fonctionne que pour les applications dont la détection de la version est désactivée.",
|
||||
"releaseDateAsVersion": "Utiliser la date de sortie comme version",
|
||||
"releaseTitleAsVersion": "Utiliser le titre de la version comme chaîne de caractères de la version",
|
||||
"releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais dont une date de sortie est disponible.",
|
||||
"changes": "Modifications",
|
||||
"releaseDate": "Date de sortie",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Aide/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Configurations d'applications par la communauté (à utiliser à vos risques et périls)",
|
||||
"allowInsecure": "Autoriser les requêtes HTTP non sécurisées",
|
||||
"stayOneVersionBehind": "Rester à une version de la dernière",
|
||||
"removeAppQuestion": {
|
||||
"one": "Supprimer l'application ?",
|
||||
"other": "Supprimer les applications ?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Eltávolítás az eszközről",
|
||||
"onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.",
|
||||
"releaseDateAsVersion": "Használja a kiadás dátumát verzióként",
|
||||
"releaseTitleAsVersion": "A kiadás címét verziószálként használja",
|
||||
"releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően, de elérhető a kiadás dátuma.",
|
||||
"changes": "Változások",
|
||||
"releaseDate": "Kiadás dátuma",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Súgó/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsource-ből származó alkalmazások beállítása (saját felelősségére használja)",
|
||||
"allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése",
|
||||
"stayOneVersionBehind": "Maradjon egy verzióval a legfrissebb mögött",
|
||||
"removeAppQuestion": {
|
||||
"one": "Eltávolítja az alkalmazást?",
|
||||
"other": "Eltávolítja az alkalmazásokat?"
|
||||
|
@@ -154,7 +154,7 @@
|
||||
"errorCheckingUpdates": "Kesalahan dalam memeriksa pembaruan",
|
||||
"errorCheckingUpdatesNotifDescription": "Notifikasi yang ditampilkan saat pemeriksaan pembaruan latar belakang gagal",
|
||||
"appsRemoved": "Aplikasi dihapus",
|
||||
"appsRemovedNotifDescription": "Memberi tahu pengguna bahwa aplikasi aplikasi dihapus karena kesalahan saat memuatnya",
|
||||
"appsRemovedNotifDescription": "Memberi tahu pengguna bahwa aplikasi dihapus karena kesalahan saat memuatnya",
|
||||
"xWasRemovedDueToErrorY": "{} dihapus karena kesalahan berikut: {}",
|
||||
"completeAppInstallation": "Selesaikan pemasangan aplikasi",
|
||||
"obtainiumMustBeOpenToInstallApps": "Obtainium harus terbuka untuk memasang aplikasi",
|
||||
@@ -204,7 +204,7 @@
|
||||
"categoryDeleteWarning": "Semua aplikasi dalam kategori yang dihapus akan diatur sebagai tidak terkategori.",
|
||||
"addCategory": "Tambah kategori",
|
||||
"label": "Label",
|
||||
"language": "Language",
|
||||
"language": "Bahasa",
|
||||
"copiedToClipboard": "Disalin ke papan klip",
|
||||
"storagePermissionDenied": "Izin penyimpanan ditolak",
|
||||
"selectedCategorizeWarning": "Ini akan mengganti pengaturan kategori yang ada untuk aplikasi terpilih.",
|
||||
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Copot pemasangan dari perangkat",
|
||||
"onlyWorksWithNonVersionDetectApps": "Hanya bekerja untuk aplikasi dengan pendeteksi versi yang nonaktif.",
|
||||
"releaseDateAsVersion": "Gunakan tanggal rilis sebagai versi string",
|
||||
"releaseTitleAsVersion": "Gunakan judul rilis sebagai string versi",
|
||||
"releaseDateAsVersionExplanation": "Opsi ini hanya boleh digunakan untuk aplikasi dengan pendeteksi versi yang tidak berfungsi dengan benar, tetapi tanggal rilisnya tersedia.",
|
||||
"changes": "Perubahan",
|
||||
"releaseDate": "Tanggal rilis",
|
||||
@@ -231,8 +232,8 @@
|
||||
"about": "Tentang",
|
||||
"requiresCredentialsInSettings": "{} memerlukan kredensial tambahan (dalam pengaturan)",
|
||||
"checkOnStart": "Periksa pembaruan saat proses memulai",
|
||||
"tryInferAppIdFromCode": "Coba simpulkan ID aplikasi dari kode sumber",
|
||||
"removeOnExternalUninstall": "Secara otomatis menghapus aplikasi yang dicopot pemasangannya dari luar",
|
||||
"tryInferAppIdFromCode": "Coba untuk menebak ID aplikasi dari kode sumber",
|
||||
"removeOnExternalUninstall": "Hapus otomatis aplikasi yang dicopot pemasangannya dari luar",
|
||||
"pickHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi",
|
||||
"checkUpdateOnDetailPage": "Periksa pembaruan saat membuka halaman detail aplikasi",
|
||||
"disablePageTransitions": "Nonaktifkan animasi transisi halaman",
|
||||
@@ -257,7 +258,7 @@
|
||||
"intermediateLink": "Tautan perantara",
|
||||
"exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)",
|
||||
"bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakan WiFi",
|
||||
"autoSelectHighestVersionCode": "Secara otomatis pilih APK dengan versi kode tertinggi",
|
||||
"autoSelectHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi",
|
||||
"versionExtractionRegEx": "Reguler ekspresi terkait ekstraksi versi string",
|
||||
"trimVersionString": "Potong versi string dengan reguler ekspresi",
|
||||
"matchGroupToUseForX": "Cocokkan grup yang akan digunakan untuk \"{}\"",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Bantuan/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Konfigurasi aplikasi Crowdsourced (risiko penggunaan ditanggung sendiri)",
|
||||
"allowInsecure": "Izinkan permintaan HTTP yang tidak aman",
|
||||
"stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru",
|
||||
"removeAppQuestion": {
|
||||
"one": "Hapus aplikasi?",
|
||||
"other": "Hapus aplikasi?"
|
||||
@@ -356,8 +358,8 @@
|
||||
"other": "Menghapus {n} catatan (sebelum = {before}, setelah = {after})"
|
||||
},
|
||||
"xAndNMoreUpdatesAvailable": {
|
||||
"one": "{} dan 1 aplikasi lainnya mendapat pembaruan.",
|
||||
"other": "{} dan {} aplikasi lainnya mendapat pembaruan."
|
||||
"one": "{} dan 1 aplikasi lainnya memiliki pembaruan.",
|
||||
"other": "{} dan {} aplikasi lainnya memiliki pembaruan."
|
||||
},
|
||||
"xAndNMoreUpdatesInstalled": {
|
||||
"one": "{} dan 1 aplikasi lainnya telah diperbarui.",
|
||||
@@ -375,4 +377,4 @@
|
||||
"one": "{} APK",
|
||||
"other": "{} APK"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Disinstalla dal dispositivo",
|
||||
"onlyWorksWithNonVersionDetectApps": "Funziona solo per le app con il rilevamento della versione disattivato.",
|
||||
"releaseDateAsVersion": "Usa data di rilascio come versione",
|
||||
"releaseTitleAsVersion": "Usa il titolo della versione come stringa di versione",
|
||||
"releaseDateAsVersionExplanation": "Questa opzione dovrebbe essere usata solo per le app in cui il rilevamento della versione non funziona correttamente, ma è disponibile una data di rilascio.",
|
||||
"changes": "Novità",
|
||||
"releaseDate": "Data di rilascio",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Aiuto/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)",
|
||||
"allowInsecure": "Consentire le richieste HTTP non sicure",
|
||||
"stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente",
|
||||
"removeAppQuestion": {
|
||||
"one": "Rimuovere l'app?",
|
||||
"other": "Rimuovere le app?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "デバイスからアンインストールする",
|
||||
"onlyWorksWithNonVersionDetectApps": "バージョン検出を無効にしているアプリにのみ動作します。",
|
||||
"releaseDateAsVersion": "リリース日をバージョンとして使用する",
|
||||
"releaseTitleAsVersion": "リリースタイトルをバージョン文字列として使用",
|
||||
"releaseDateAsVersionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリで、リリース日が利用可能な場合にのみ使用する必要があります。",
|
||||
"changes": "変更点",
|
||||
"releaseDate": "リリース日",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "ヘルプ/ウィキ",
|
||||
"crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)",
|
||||
"allowInsecure": "安全でないHTTPリクエストを許可する",
|
||||
"stayOneVersionBehind": "最新バージョンから1つ遅れ",
|
||||
"removeAppQuestion": {
|
||||
"one": "アプリを削除しますか?",
|
||||
"other": "アプリを削除しますか?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Van apparaat verwijderen",
|
||||
"onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.",
|
||||
"releaseDateAsVersion": "Releasedatum als versie gebruiken",
|
||||
"releaseTitleAsVersion": "Gebruik releasetitel als versiestring",
|
||||
"releaseDateAsVersionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt, maar waar wel een releasedatum beschikbaar is.",
|
||||
"changes": "Aanpassingen",
|
||||
"releaseDate": "Releasedatum",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Help/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)",
|
||||
"allowInsecure": "Onveilige HTTP-verzoeken toestaan",
|
||||
"stayOneVersionBehind": "Blijf een versie achter op de nieuwste",
|
||||
"removeAppQuestion": {
|
||||
"one": "App verwijderen?",
|
||||
"other": "Apps verwijderen?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Odinstaluj z urządzenia",
|
||||
"onlyWorksWithNonVersionDetectApps": "Działa tylko w przypadku aplikacji z wyłączonym wykrywaniem wersji.",
|
||||
"releaseDateAsVersion": "Użyj daty wydania jako wersji",
|
||||
"releaseTitleAsVersion": "Użyj tytułu wydania jako ciągu znaków wersji",
|
||||
"releaseDateAsVersionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie, ale dostępna jest data wydania.",
|
||||
"changes": "Zmiany",
|
||||
"releaseDate": "Data wydania",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Pomoc/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)",
|
||||
"allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP",
|
||||
"stayOneVersionBehind": "Pozostań jedną wersję za najnowszą",
|
||||
"removeAppQuestion": {
|
||||
"one": "Usunąć aplikację?",
|
||||
"few": "Usunąć aplikacje?",
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Desinstalar do dispositivo",
|
||||
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecçã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.",
|
||||
"changes": "Alterações",
|
||||
"releaseDate": "Data de lançamento",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Ajuda/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)",
|
||||
"allowInsecure": "Permitir pedidos HTTP inseguros",
|
||||
"stayOneVersionBehind": "Manter-se uma versão atrás da mais recente",
|
||||
"removeAppQuestion": {
|
||||
"one": "Remover aplicativo?",
|
||||
"other": "Remover aplicativos?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Удалить с устройства",
|
||||
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии",
|
||||
"releaseDateAsVersion": "Дата выпуска вместо версии",
|
||||
"releaseTitleAsVersion": "Используйте название релиза в качестве строки версии",
|
||||
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
|
||||
"changes": "Изменения",
|
||||
"releaseDate": "Дата выпуска",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Помощь/Вики",
|
||||
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
||||
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
|
||||
"stayOneVersionBehind": "Не отставайте от последней версии",
|
||||
"removeAppQuestion": {
|
||||
"one": "Удалить приложение?",
|
||||
"other": "Удалить приложения?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Avinstallera från Enheten",
|
||||
"onlyWorksWithNonVersionDetectApps": "Fungerar bara för Appar med versionsdetektering inaktiverat..",
|
||||
"releaseDateAsVersion": "Använd releasedatum som version",
|
||||
"releaseTitleAsVersion": "Använd release-titel som versionssträng",
|
||||
"releaseDateAsVersionExplanation": "Det här alternativet bör endast användas för appar där versionsidentifiering inte fungerar korrekt, men ett releasedatum är tillgängligt.",
|
||||
"changes": "Ändringar",
|
||||
"releaseDate": "Releasedatum",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Hjälp/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)",
|
||||
"allowInsecure": "Tillåt osäkra HTTP-förfrågningar",
|
||||
"stayOneVersionBehind": "Håll dig en version bakom den senaste",
|
||||
"removeAppQuestion": {
|
||||
"one": "Ta Bort App?",
|
||||
"other": "Ta Bort Appar?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Cihazdan Kaldır",
|
||||
"onlyWorksWithNonVersionDetectApps": "Yalnızca Sürüm Algılaması Devre Dışı Uygulamalar İçin Çalışır.",
|
||||
"releaseDateAsVersion": "Sürüm Olarak Yayın Tarihi Kullan",
|
||||
"releaseTitleAsVersion": "Sürüm dizesi olarak sürüm başlığını kullan",
|
||||
"releaseDateAsVersionExplanation": "Bu seçenek, sürüm algılamanın doğru çalışmadığı ancak bir sürüm tarihinin mevcut olduğu uygulamalar için kullanılmalıdır.",
|
||||
"changes": "Değişiklikler",
|
||||
"releaseDate": "Yayın Tarihi",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Yardım/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)",
|
||||
"allowInsecure": "Güvensiz HTTP isteklerine izin ver",
|
||||
"stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın",
|
||||
"removeAppQuestion": {
|
||||
"one": "Uygulamayı Kaldır?",
|
||||
"other": "Uygulamaları Kaldır?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Видалити з пристрою",
|
||||
"onlyWorksWithNonVersionDetectApps": "Працює лише з застосунками з вимкненим визначенням версії.",
|
||||
"releaseDateAsVersion": "Використовувати дату випуску як рядок версії",
|
||||
"releaseTitleAsVersion": "Використовувати назву випуску як рядок версії",
|
||||
"releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.",
|
||||
"changes": "Зміни",
|
||||
"releaseDate": "Дата випуску",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Довідка/Вікі",
|
||||
"crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)",
|
||||
"allowInsecure": "Дозволити незахищені HTTP-запити",
|
||||
"stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою",
|
||||
"removeAppQuestion": {
|
||||
"one": "Видалити застосунок?",
|
||||
"other": "Видалити застосунки?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "Gỡ cài đặt khỏi thiết bị",
|
||||
"onlyWorksWithNonVersionDetectApps": "Chỉ hoạt động với Ứng dụng đã tắt tính năng phát hiện phiên bản.",
|
||||
"releaseDateAsVersion": "Sử dụng ngày phát hành làm phiên bản",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng trong đó tính năng phát hiện phiên bản không hoạt động chính xác nhưng đã có ngày phát hành.",
|
||||
"changes": "Thay đổi",
|
||||
"releaseDate": "Ngày phát hành",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "Trợ giúp/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "Gỡ ứng dụng?",
|
||||
"other": "Gỡ ứng dụng?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "從裝置解除安裝",
|
||||
"onlyWorksWithNonVersionDetectApps": "僅適用於停用版本偵測的應用程式。",
|
||||
"releaseDateAsVersion": "使用發佈日期作為版本字串",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseDateAsVersionExplanation": "此選項僅應用於版本偵測無法正確工作但有發佈日期的應用程式。",
|
||||
"changes": "變更",
|
||||
"releaseDate": "發佈日期",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "幫助/維基",
|
||||
"crowdsourcedConfigsLabel": "群眾外包的應用程式設定(使用風險自負)",
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"removeAppQuestion": {
|
||||
"one": "移除應用程式?",
|
||||
"other": "移除應用程式?"
|
||||
|
@@ -213,6 +213,7 @@
|
||||
"uninstallFromDevice": "从设备中卸载",
|
||||
"onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。",
|
||||
"releaseDateAsVersion": "将发行日期作为版本号",
|
||||
"releaseTitleAsVersion": "使用版本标题作为版本字符串",
|
||||
"releaseDateAsVersionExplanation": "此选项应该仅用于无法进行版本检测但能够获取发行日期的应用。",
|
||||
"changes": "更新日志",
|
||||
"releaseDate": "发行日期",
|
||||
@@ -315,6 +316,7 @@
|
||||
"wiki": "帮助/Wiki",
|
||||
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
||||
"allowInsecure": "允许不安全的 HTTP 请求",
|
||||
"stayOneVersionBehind": "比最新版本晚一个版本",
|
||||
"removeAppQuestion": {
|
||||
"one": "是否删除应用?",
|
||||
"other": "是否删除应用?"
|
||||
|
@@ -2,6 +2,7 @@ import 'package:device_info_plus/device_info_plus.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:html/parser.dart';
|
||||
import 'package:obtainium/app_sources/html.dart';
|
||||
import 'package:obtainium/components/generated_form.dart';
|
||||
import 'package:obtainium/custom_errors.dart';
|
||||
import 'package:obtainium/providers/source_provider.dart';
|
||||
|
||||
@@ -26,6 +27,16 @@ class APKPure extends AppSource {
|
||||
allowSubDomains = true;
|
||||
naiveStandardVersionDetection = true;
|
||||
showReleaseDateAsVersionToggle = true;
|
||||
additionalSourceAppSpecificSettingFormItems = [
|
||||
[
|
||||
GeneratedFormSwitch('fallbackToOlderReleases',
|
||||
label: tr('fallbackToOlderReleases'), defaultValue: true)
|
||||
],
|
||||
[
|
||||
GeneratedFormSwitch('stayOneVersionBehind',
|
||||
label: tr('stayOneVersionBehind'), defaultValue: false)
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -54,6 +65,97 @@ class APKPure extends AppSource {
|
||||
return Uri.parse(standardUrl).pathSegments.last;
|
||||
}
|
||||
|
||||
getDetailsForVersionLink(
|
||||
String standardUrl,
|
||||
String appId,
|
||||
String host,
|
||||
List<String> supportedArchs,
|
||||
String link,
|
||||
Map<String, dynamic> additionalSettings) async {
|
||||
var res = await sourceRequest(link, additionalSettings);
|
||||
if (res.statusCode == 200) {
|
||||
var html = parse(res.body);
|
||||
var apksDiv =
|
||||
html.querySelector('#version-list div div.show-more-content');
|
||||
DateTime? topReleaseDate;
|
||||
var apkUrls = apksDiv
|
||||
?.querySelectorAll('div.group-title')
|
||||
.map((e) {
|
||||
String architectureString = e.text.trim();
|
||||
if (architectureString.toLowerCase() == 'unlimited' ||
|
||||
architectureString.toLowerCase() == 'universal') {
|
||||
architectureString = '';
|
||||
}
|
||||
List<String> architectures = architectureString
|
||||
.split(',')
|
||||
.map((e) => e.trim())
|
||||
.where((e) => e.isNotEmpty)
|
||||
.toList();
|
||||
// Only take the first APK for each architecture, ignore others for now, for simplicity
|
||||
// Unclear why there can even be multiple APKs for the same version and arch
|
||||
var apkInfo = e.nextElementSibling?.querySelector('div.info');
|
||||
String? versionCode = RegExp('[0-9]+')
|
||||
.firstMatch(apkInfo
|
||||
?.querySelector('div.info-top span.code')
|
||||
?.text ??
|
||||
'')
|
||||
?.group(0)
|
||||
?.trim();
|
||||
var types = apkInfo
|
||||
?.querySelectorAll('div.info-top span.tag')
|
||||
.map((e) => e.text.trim())
|
||||
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
||||
[];
|
||||
String type = types.isEmpty
|
||||
? 'APK'
|
||||
: types.length == 1
|
||||
? types.first
|
||||
: types.last;
|
||||
String? dateString = apkInfo
|
||||
?.querySelector('div.info-bottom span.time')
|
||||
?.text
|
||||
.trim();
|
||||
DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString);
|
||||
if (additionalSettings['autoApkFilterByArch'] == true &&
|
||||
architectures.isNotEmpty &&
|
||||
architectures
|
||||
.where((a) => supportedArchs.contains(a))
|
||||
.isEmpty) {
|
||||
return const MapEntry('', '');
|
||||
}
|
||||
topReleaseDate ??=
|
||||
releaseDate; // Just use the release date of the first APK in the list as the release date for this version
|
||||
return MapEntry(
|
||||
'$appId-$versionCode-$architectureString.${type.toLowerCase()}',
|
||||
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode');
|
||||
})
|
||||
.where((e) => e.key.isNotEmpty)
|
||||
.toList() ??
|
||||
[];
|
||||
if (apkUrls.isEmpty) {
|
||||
throw NoAPKError();
|
||||
}
|
||||
String version = Uri.parse(link).pathSegments.last;
|
||||
String author = html
|
||||
.querySelector('span.info-sdk')
|
||||
?.text
|
||||
.trim()
|
||||
.substring(version.length + 4) ??
|
||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||
String appName =
|
||||
html.querySelector('h1.info-title')?.text.trim() ?? appId;
|
||||
String? changeLog = html
|
||||
.querySelector('div.module.change-log')
|
||||
?.innerHtml
|
||||
.trim()
|
||||
.replaceAll("<br>", " \n");
|
||||
return APKDetails(version, apkUrls, AppNames(author, appName),
|
||||
releaseDate: topReleaseDate, changeLog: changeLog);
|
||||
} else {
|
||||
throw getObtainiumHttpError(res);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<APKDetails> getLatestAPKDetails(
|
||||
String standardUrl,
|
||||
@@ -80,88 +182,17 @@ class APKPure extends AppSource {
|
||||
|
||||
for (var i = 0; i < versionLinks.length; i++) {
|
||||
var link = versionLinks[i];
|
||||
var res = await sourceRequest(link.key, additionalSettings);
|
||||
if (res.statusCode == 200) {
|
||||
var html = parse(res.body);
|
||||
var apksDiv =
|
||||
html.querySelector('#version-list div div.show-more-content');
|
||||
DateTime? topReleaseDate;
|
||||
var apkUrls = apksDiv
|
||||
?.querySelectorAll('div.group-title')
|
||||
.map((e) {
|
||||
String architectureString = e.text.trim();
|
||||
if (architectureString.toLowerCase() == 'unlimited' ||
|
||||
architectureString.toLowerCase() == 'universal') {
|
||||
architectureString = '';
|
||||
}
|
||||
List<String> architectures = architectureString
|
||||
.split(',')
|
||||
.map((e) => e.trim())
|
||||
.where((e) => e.isNotEmpty)
|
||||
.toList();
|
||||
// Only take the first APK for each architecture, ignore others for now, for simplicity
|
||||
// Unclear why there can even be multiple APKs for the same version and arch
|
||||
var apkInfo = e.nextElementSibling?.querySelector('div.info');
|
||||
String? versionCode = RegExp('[0-9]+')
|
||||
.firstMatch(apkInfo
|
||||
?.querySelector('div.info-top span.code')
|
||||
?.text ??
|
||||
'')
|
||||
?.group(0)
|
||||
?.trim();
|
||||
var types = apkInfo
|
||||
?.querySelectorAll('div.info-top span.tag')
|
||||
.map((e) => e.text.trim())
|
||||
.map((t) => t == 'APKs' ? 'APK' : t) ??
|
||||
[];
|
||||
String type = types.isEmpty
|
||||
? 'APK'
|
||||
: types.length == 1
|
||||
? types.first
|
||||
: types.last;
|
||||
String? dateString = apkInfo
|
||||
?.querySelector('div.info-bottom span.time')
|
||||
?.text
|
||||
.trim();
|
||||
DateTime? releaseDate =
|
||||
parseDateTimeMMMddCommayyyy(dateString);
|
||||
if (additionalSettings['autoApkFilterByArch'] == true &&
|
||||
architectures.isNotEmpty &&
|
||||
architectures
|
||||
.where((a) => supportedArchs.contains(a))
|
||||
.isEmpty) {
|
||||
return const MapEntry('', '');
|
||||
}
|
||||
topReleaseDate ??=
|
||||
releaseDate; // Just use the release date of the first APK in the list as the release date for this version
|
||||
return MapEntry(
|
||||
'$appId-$versionCode-$architectureString.${type.toLowerCase()}',
|
||||
'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode');
|
||||
})
|
||||
.where((e) => e.key.isNotEmpty)
|
||||
.toList() ??
|
||||
[];
|
||||
if (apkUrls.isEmpty) {
|
||||
continue;
|
||||
try {
|
||||
if (i == 0 && additionalSettings['stayOneVersionBehind'] == true) {
|
||||
throw NoReleasesError();
|
||||
}
|
||||
return await getDetailsForVersionLink(standardUrl, appId, host,
|
||||
supportedArchs, link.key, additionalSettings);
|
||||
} catch (e) {
|
||||
if (additionalSettings['fallbackToOlderReleases'] != true ||
|
||||
i == versionLinks.length - 1) {
|
||||
rethrow;
|
||||
}
|
||||
String version = Uri.parse(link.key).pathSegments.last;
|
||||
String author = html
|
||||
.querySelector('span.info-sdk')
|
||||
?.text
|
||||
.trim()
|
||||
.substring(version.length + 4) ??
|
||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||
String appName =
|
||||
html.querySelector('h1.info-title')?.text.trim() ?? appId;
|
||||
String? changeLog = html
|
||||
.querySelector('div.module.change-log')
|
||||
?.innerHtml
|
||||
.trim()
|
||||
.replaceAll("<br>", " \n");
|
||||
return APKDetails(version, apkUrls, AppNames(author, appName),
|
||||
releaseDate: topReleaseDate, changeLog: changeLog);
|
||||
} else {
|
||||
throw getObtainiumHttpError(res);
|
||||
}
|
||||
}
|
||||
throw NoAPKError();
|
||||
|
@@ -81,6 +81,10 @@ class GitHub extends AppSource {
|
||||
[
|
||||
GeneratedFormSwitch('useLatestAssetDateAsReleaseDate',
|
||||
label: tr('useLatestAssetDateAsReleaseDate'), defaultValue: false)
|
||||
],
|
||||
[
|
||||
GeneratedFormSwitch('releaseTitleAsVersion',
|
||||
label: tr('releaseTitleAsVersion'), defaultValue: false)
|
||||
]
|
||||
];
|
||||
|
||||
@@ -396,7 +400,9 @@ class GitHub extends AppSource {
|
||||
targetRelease = releases[i];
|
||||
targetRelease['apkUrls'] = apkUrls;
|
||||
targetRelease['version'] =
|
||||
targetRelease['tag_name'] ?? targetRelease['name'];
|
||||
additionalSettings['releaseTitleAsVersion'] == true
|
||||
? nameToFilter
|
||||
: targetRelease['tag_name'] ?? targetRelease['name'];
|
||||
if (targetRelease['tarball_url'] != null) {
|
||||
allAssetUrls.add(MapEntry(
|
||||
(targetRelease['version'] ?? 'source') + '.tar.gz',
|
||||
|
@@ -60,8 +60,17 @@ class SourceHut extends AppSource {
|
||||
int ind = 0;
|
||||
|
||||
for (var entry in parsedHtml.querySelectorAll('item').sublist(0, 6)) {
|
||||
// Limit 5 for speed
|
||||
if (!fallbackToOlderReleases && ind > 0) {
|
||||
ind++;
|
||||
String releasePage = // querySelector('link') fails for some reason
|
||||
entry
|
||||
.querySelector('guid') // Luckily guid is identical
|
||||
?.innerHtml
|
||||
.trim() ??
|
||||
'';
|
||||
if (!releasePage.startsWith('$standardUrl/refs')) {
|
||||
continue;
|
||||
}
|
||||
if (!fallbackToOlderReleases && ind > 1) {
|
||||
break;
|
||||
}
|
||||
String? version = entry.querySelector('title')?.text.trim();
|
||||
@@ -69,7 +78,6 @@ class SourceHut extends AppSource {
|
||||
throw NoVersionError();
|
||||
}
|
||||
String? releaseDateString = entry.querySelector('pubDate')?.innerHtml;
|
||||
String releasePage = '$standardUrl/refs/$version';
|
||||
DateTime? releaseDate;
|
||||
try {
|
||||
releaseDate = releaseDateString != null
|
||||
@@ -98,7 +106,6 @@ class SourceHut extends AppSource {
|
||||
AppNames(entry.querySelector('author')?.innerHtml.trim() ?? appName,
|
||||
appName),
|
||||
releaseDate: releaseDate));
|
||||
ind++;
|
||||
}
|
||||
if (apkDetailsList.isEmpty) {
|
||||
throw NoReleasesError();
|
||||
|
@@ -30,6 +30,7 @@ class AddAppPageState extends State<AddAppPage> {
|
||||
String userInput = '';
|
||||
String searchQuery = '';
|
||||
String? pickedSourceOverride;
|
||||
String? previousPickedSourceOverride;
|
||||
AppSource? pickedSource;
|
||||
Map<String, dynamic> additionalSettings = {};
|
||||
bool additionalSettingsValid = true;
|
||||
@@ -58,6 +59,9 @@ class AddAppPageState extends State<AddAppPage> {
|
||||
if (overrideSource != null) {
|
||||
pickedSourceOverride = overrideSource;
|
||||
}
|
||||
bool overrideChanged =
|
||||
pickedSourceOverride != previousPickedSourceOverride;
|
||||
previousPickedSourceOverride = pickedSourceOverride;
|
||||
if (updateUrlInput) {
|
||||
urlInputKey++;
|
||||
}
|
||||
@@ -69,6 +73,7 @@ class AddAppPageState extends State<AddAppPage> {
|
||||
overrideSource: pickedSourceOverride)
|
||||
: null;
|
||||
if (pickedSource.runtimeType != source.runtimeType ||
|
||||
overrideChanged ||
|
||||
(prevHost != null && prevHost != source?.hosts[0])) {
|
||||
pickedSource = source;
|
||||
pickedSource?.runOnAddAppInputChange(userInput);
|
||||
@@ -487,7 +492,8 @@ class AddAppPageState extends State<AddAppPage> {
|
||||
height: 16,
|
||||
),
|
||||
GeneratedForm(
|
||||
key: Key(pickedSource.runtimeType.toString()),
|
||||
key: Key(
|
||||
'${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}'),
|
||||
items: [
|
||||
...pickedSource!.combinedAppSpecificSettingFormItems,
|
||||
...(pickedSourceOverride != null
|
||||
|
@@ -242,11 +242,11 @@ class _AppPageState extends State<AppPage> {
|
||||
);
|
||||
}
|
||||
|
||||
getFullInfoColumn() => Column(
|
||||
getFullInfoColumn({bool small = false}) => Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
const SizedBox(height: 20),
|
||||
SizedBox(height: small ? 5 : 20),
|
||||
FutureBuilder(
|
||||
future:
|
||||
appsProvider.updateAppIcon(app?.app.id, ignoreCache: true),
|
||||
@@ -261,24 +261,28 @@ class _AppPageState extends State<AppPage> {
|
||||
: () => pm.openApp(app.app.id),
|
||||
child: Image.memory(
|
||||
app!.icon!,
|
||||
height: 150,
|
||||
height: small ? 70 : 150,
|
||||
gaplessPlayback: true,
|
||||
),
|
||||
)
|
||||
])
|
||||
: Container();
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 25,
|
||||
SizedBox(
|
||||
height: small ? 10 : 25,
|
||||
),
|
||||
Text(
|
||||
app?.name ?? tr('app'),
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).textTheme.displayLarge,
|
||||
style: small
|
||||
? Theme.of(context).textTheme.displaySmall
|
||||
: Theme.of(context).textTheme.displayLarge,
|
||||
),
|
||||
Text(tr('byX', args: [app?.app.author ?? tr('unknown')]),
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).textTheme.headlineMedium),
|
||||
style: small
|
||||
? Theme.of(context).textTheme.headlineSmall
|
||||
: Theme.of(context).textTheme.headlineMedium),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
@@ -496,11 +500,8 @@ class _AppPageState extends State<AppPage> {
|
||||
builder: (BuildContext ctx) {
|
||||
return AlertDialog(
|
||||
scrollable: true,
|
||||
content: getInfoColumn(),
|
||||
title: Text(
|
||||
'${app.name} ${tr('byX', args: [
|
||||
app.app.author
|
||||
])}'),
|
||||
content: getFullInfoColumn(small: true),
|
||||
title: Text(app.name),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
|
@@ -578,6 +578,22 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
})
|
||||
],
|
||||
),
|
||||
height16,
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
tr('shizukuPretendToBeGooglePlay'))),
|
||||
Switch(
|
||||
value: settingsProvider
|
||||
.shizukuPretendToBeGooglePlay,
|
||||
onChanged: (value) {
|
||||
settingsProvider
|
||||
.shizukuPretendToBeGooglePlay = value;
|
||||
})
|
||||
],
|
||||
),
|
||||
height32,
|
||||
Text(
|
||||
tr('sourceSpecific'),
|
||||
|
@@ -879,22 +879,20 @@ class AppsProvider with ChangeNotifier {
|
||||
apps[id]?.installedInfo == null ? context : null;
|
||||
bool needBGWorkaround =
|
||||
willBeSilent && context == null && !settingsProvider.useShizuku;
|
||||
bool shizukuPretendToBeGooglePlay = settingsProvider
|
||||
.shizukuPretendToBeGooglePlay ||
|
||||
apps[id]!.app.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||
true;
|
||||
if (downloadedFile != null) {
|
||||
if (needBGWorkaround) {
|
||||
// ignore: use_build_context_synchronously
|
||||
installApk(downloadedFile, contextIfNewInstall,
|
||||
needsBGWorkaround: true,
|
||||
shizukuPretendToBeGooglePlay: apps[id]!
|
||||
.app
|
||||
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||
true);
|
||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||
} else {
|
||||
// ignore: use_build_context_synchronously
|
||||
sayInstalled = await installApk(downloadedFile, contextIfNewInstall,
|
||||
shizukuPretendToBeGooglePlay: apps[id]!
|
||||
.app
|
||||
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||
true);
|
||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||
}
|
||||
} else {
|
||||
if (needBGWorkaround) {
|
||||
@@ -905,10 +903,7 @@ class AppsProvider with ChangeNotifier {
|
||||
// ignore: use_build_context_synchronously
|
||||
sayInstalled = await installXApkDir(
|
||||
downloadedDir!, contextIfNewInstall,
|
||||
shizukuPretendToBeGooglePlay: apps[id]!
|
||||
.app
|
||||
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||
true);
|
||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay);
|
||||
}
|
||||
}
|
||||
if (willBeSilent && context == null) {
|
||||
|
@@ -48,7 +48,7 @@ class SettingsProvider with ChangeNotifier {
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
bool get useShizuku{
|
||||
bool get useShizuku {
|
||||
return prefs?.getBool('useShizuku') ?? false;
|
||||
}
|
||||
|
||||
@@ -69,8 +69,7 @@ class SettingsProvider with ChangeNotifier {
|
||||
|
||||
Color get themeColor {
|
||||
int? colorCode = prefs?.getInt('themeColor');
|
||||
return (colorCode != null) ?
|
||||
Color(colorCode) : obtainiumThemeColor;
|
||||
return (colorCode != null) ? Color(colorCode) : obtainiumThemeColor;
|
||||
}
|
||||
|
||||
set themeColor(Color themeColor) {
|
||||
@@ -469,4 +468,13 @@ class SettingsProvider with ChangeNotifier {
|
||||
prefs?.setBool('beforeNewInstallsShareToAppVerifier', val);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
bool get shizukuPretendToBeGooglePlay {
|
||||
return prefs?.getBool('shizukuPretendToBeGooglePlay') ?? false;
|
||||
}
|
||||
|
||||
set shizukuPretendToBeGooglePlay(bool val) {
|
||||
prefs?.setBool('shizukuPretendToBeGooglePlay', val);
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
@@ -414,6 +414,7 @@ HttpClient createHttpClient(bool insecure) {
|
||||
abstract class AppSource {
|
||||
List<String> hosts = [];
|
||||
bool hostChanged = false;
|
||||
bool hostIdenticalDespiteAnyChange = false;
|
||||
late String name;
|
||||
bool enforceTrackOnly = false;
|
||||
bool changeLogIfAnyIsMarkDown = true;
|
||||
@@ -628,9 +629,10 @@ abstract class AppSource {
|
||||
SettingsProvider settingsProvider) async {
|
||||
Map<String, String> results = {};
|
||||
for (var e in sourceConfigSettingFormItems) {
|
||||
var val = hostChanged
|
||||
var val = hostChanged && !hostIdenticalDespiteAnyChange
|
||||
? additionalSettings[e.key]
|
||||
: settingsProvider.getSettingString(e.key);
|
||||
: additionalSettings[e.key] ??
|
||||
settingsProvider.getSettingString(e.key);
|
||||
if (val != null) {
|
||||
results[e.key] = val;
|
||||
}
|
||||
@@ -813,9 +815,14 @@ class SourceProvider {
|
||||
throw UnsupportedURLError();
|
||||
}
|
||||
var res = srcs.first;
|
||||
res.hosts = [Uri.parse(url).host];
|
||||
var originalHosts = res.hosts;
|
||||
var newHost = Uri.parse(url).host;
|
||||
res.hosts = [newHost];
|
||||
res.hostChanged = true;
|
||||
return srcs.first;
|
||||
if (originalHosts.contains(newHost)) {
|
||||
res.hostIdenticalDespiteAnyChange = true;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
AppSource? source;
|
||||
for (var s in sources.where((element) => element.hosts.isNotEmpty)) {
|
||||
|
@@ -1097,10 +1097,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_android
|
||||
sha256: "6e64fcb1c19d92024da8f33503aaeeda35825d77142c01d0ea2aa32edc79fdc8"
|
||||
sha256: ed021f27ae621bc97a6019fb601ab16331a3db4bf8afa305e9f6689bdb3edced
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.16.7"
|
||||
version: "3.16.8"
|
||||
webview_flutter_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
version: 1.1.24+2281
|
||||
version: 1.1.26+2283
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
|
Reference in New Issue
Block a user