From 6ce9f29331db4ad553447b17b5108a78945ad6b9 Mon Sep 17 00:00:00 2001 From: KingLucius Date: Thu, 2 Nov 2023 21:50:49 +0200 Subject: [PATCH 01/20] Fix settings top bar on TV (#738) --- .../cloudstream3/ui/settings/SettingsAccount.kt | 2 ++ .../cloudstream3/ui/settings/SettingsFragment.kt | 10 ++++++++++ .../cloudstream3/ui/settings/SettingsGeneral.kt | 3 ++- .../cloudstream3/ui/settings/SettingsPlayer.kt | 2 ++ .../cloudstream3/ui/settings/SettingsProviders.kt | 2 ++ .../lagradost/cloudstream3/ui/settings/SettingsUI.kt | 2 ++ .../cloudstream3/ui/settings/SettingsUpdates.kt | 2 ++ 7 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt index b3225d5c..aa5a3182 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt @@ -30,6 +30,7 @@ import com.lagradost.cloudstream3.syncproviders.OAuth2API import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe @@ -248,6 +249,7 @@ class SettingsAccount : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_account) setPaddingBottom() + setToolBarScrollFlags() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index a4d19eba..cb48b086 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -12,10 +12,12 @@ import android.widget.ImageView import androidx.annotation.StringRes import androidx.core.view.children import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager +import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.MainSettingsBinding @@ -54,7 +56,15 @@ class SettingsFragment : Fragment() { listView?.setPadding(0, 0, 0, 100.toPx) } } + fun PreferenceFragmentCompat.setToolBarScrollFlags() { + if (isTvSettings()) { + val settingsAppbar = view?.findViewById(R.id.settings_toolbar) + settingsAppbar?.updateLayoutParams { + scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL + } + } + } fun Fragment?.setUpToolbar(title: String) { if (this == null) return val settingsToolbar = view?.findViewById(R.id.settings_toolbar) ?: return diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt index 17efd276..224ca74a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt @@ -28,6 +28,7 @@ import com.lagradost.cloudstream3.network.initClient import com.lagradost.cloudstream3.ui.EasterEggMonke import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog @@ -115,6 +116,7 @@ class SettingsGeneral : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_general) setPaddingBottom() + setToolBarScrollFlags() } data class CustomSite( @@ -192,7 +194,6 @@ class SettingsGeneral : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } - fun showAdd() { val providers = synchronized(allProviders) { allProviders.distinctBy { it.javaClass }.sortedBy { it.name } } activity?.showDialog( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt index e10a5a1a..3d0bcb1f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt @@ -10,6 +10,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getFolderSize import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.ui.subtitles.ChromecastSubtitlesFragment import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment @@ -23,6 +24,7 @@ class SettingsPlayer : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_player) setPaddingBottom() + setToolBarScrollFlags() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { hideKeyboard() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsProviders.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsProviders.kt index 7e57fc5b..7dc73a46 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsProviders.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsProviders.kt @@ -13,6 +13,7 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog @@ -25,6 +26,7 @@ class SettingsProviders : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_providers) setPaddingBottom() + setToolBarScrollFlags() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt index e2fd24ca..8c720313 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUI.kt @@ -11,6 +11,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.ui.search.SearchResultBuilder import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.updateTv import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog @@ -23,6 +24,7 @@ class SettingsUI : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_ui) setPaddingBottom() + setToolBarScrollFlags() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt index 2f796801..9f72c1d5 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsUpdates.kt @@ -22,6 +22,7 @@ import com.lagradost.cloudstream3.network.initClient import com.lagradost.cloudstream3.services.BackupWorkManager import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.BackupUtils import com.lagradost.cloudstream3.utils.BackupUtils.restorePrompt @@ -42,6 +43,7 @@ class SettingsUpdates : PreferenceFragmentCompat() { super.onViewCreated(view, savedInstanceState) setUpToolbar(R.string.category_updates) setPaddingBottom() + setToolBarScrollFlags() } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { From 199f5b3a9d23297cb8f772e102619339452e9ff2 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Thu, 2 Nov 2023 20:58:52 +0100 Subject: [PATCH 02/20] Translations update from Hosted Weblate (#681) Co-authored-by: Ahmed Abd El-Fattah Co-authored-by: Fjuro Co-authored-by: Fqwe1 Co-authored-by: Giuseppe Terrana Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com> Co-authored-by: Rex_sa Co-authored-by: gallegonovato Co-authored-by: ngocanhtve --- app/src/main/res/values-ar/strings.xml | 50 ++++++++++++---- app/src/main/res/values-cs/strings.xml | 49 ++++++++++++---- app/src/main/res/values-es/strings.xml | 58 ++++++++++++++----- app/src/main/res/values-it/strings.xml | 34 +++++++++-- app/src/main/res/values-uk/strings.xml | 54 ++++++++++++----- app/src/main/res/values-vi/strings.xml | 33 ++++++++++- app/src/main/res/values/strings.xml | 6 +- .../metadata/android/es-ES/changelogs/2.txt | 1 + .../android/es-ES/full_description.txt | 10 ++++ .../android/es-ES/short_description.txt | 1 + fastlane/metadata/android/es-ES/title.txt | 1 + 11 files changed, 234 insertions(+), 63 deletions(-) create mode 100644 fastlane/metadata/android/es-ES/changelogs/2.txt create mode 100644 fastlane/metadata/android/es-ES/full_description.txt create mode 100644 fastlane/metadata/android/es-ES/short_description.txt create mode 100644 fastlane/metadata/android/es-ES/title.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index f73081f7..15d22412 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -12,8 +12,8 @@ سرعة (%.2fx) تقييم: %.1f - !تم العثور على تحديث جديد -\n%s -> %s + يوجد تحديث جديد! +\n%1$s -> %2$s %d دقيقة CloudStream تشغيل بواسطة CloudStream @@ -319,7 +319,7 @@ Kitsu Trakt --> - %s %s + %1$s %2$s حساب تسجيل الخروج تسجيل الدخول @@ -418,8 +418,8 @@ تم إزالة الإضافة تعذر التحميل %s 18+ - بدأ تنزيل %d %s … - تم التنزيل %d %s + بدأ تنزيل %1$d %2$s… + تم تنزيل %1$d %2$s جميع %s محملة بالفعل تحميل مكثف إضافة @@ -461,11 +461,11 @@ السجل عرض زر تخطي المقدمة/الخاتمة طاقم العمل: %s - %d يوم %d ساعة %d دقيقة - %d ساعة %d دقيقة + %1$d يوم %2$d ساعة %3$d دقيقة + %1$d ساعة %2$d دقيقة الفيلير فتح(تشغيل) - %s %d%s + %1$s %2$d%3$s المكونات الإضافية المحدثة %d VLC MPV @@ -482,7 +482,7 @@ علّمه كفيديو تمت مشاهدته نعم - %s الحلقة %d + %1$s الحلقة %2$d سيتم إصدار الحلقة %d في تعذر تثبيت الإصدار الجديد من التطبيق تثبيت الإضافة أولا @@ -493,8 +493,8 @@ ‌تنزيل تحديث التطبيق… ‏تثبيت تحديث التطبيق… %d دقيقة - %d-%d - %d %s + %1$d-%2$d + %1$d %2$s هل أنت متأكد أنك تريد الخروج؟ قم بتثبيت جميع المكونات الإضافية التي لم يتم تثبيتها بعد تلقائيا من المستودعات المضافة. مثبت الحزم @@ -584,4 +584,30 @@ المستودع لم يتم العثور عليه، تحقق من العنوان اوجرب شبكة افتراضية خاصة(vpn) لقد صوتت بالفعل معدل النسخ الإحتياطي - + تمت إزالة %s من المفضلة + المفضلة + تمت إضافة %s إلى المفضلة + احتمال وجود تكرارات في مكتبتك. +\n +\n%s +\n +\nهل تريد الاضافة على اي حال مستبدلاً النسخة الموجودة بالفعل, أم تفضل إلغاء العملية؟ + احتمال أن يكون موجود بالفعل + قفل الحساب + اضافة الى المفضلة + تبديل الكل + رقم PIN غير صحيح. برجاء المحاولة مرة اخرى. + إلغاء الاشتراك + رقم ال PIN يجب ان يكون 4 ارقام + استبدال + اضافة + إشترك + إزالة من المفضلة + اختار حساب + من الظاهر أن \"%1$s\" موجود بالفعل في مكتبتك. +\n +\nهل تريد الاضافة على أي حال مستبدلاً القديم أو إلغاء العملية؟ + ادخال ال PIN + PIN + أدخل ال PIN الحالي + \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 8bdc1a27..ae93803d 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -2,7 +2,7 @@ - %s Ep %d + %1$s Ep %2$d Hrají: %s Plakát @@ -17,7 +17,7 @@ Rychlost (%.2fx) Hodnocení: %.1f Nalezena nová aktualizace! -\n%s -> %s +\n%1$s -> %2$s Výplň %d min CloudStream @@ -292,7 +292,7 @@ Kitsu Trakt --> - %s %s + %1$s %2$s účet Odhlásit se Přihlásit se @@ -410,17 +410,17 @@ Příliš mnoho textu. Nepodařilo se uložit do schránky. Ano Prohlížeč - %d-%d + %1$d-%2$d Knihovna Zobrazit plakáty z Kitsu Automaticky stahovat doplňky Znovu provést proces nastavení Instalátor APK - %d %s + %1$d %2$s Některé telefony nepodporují nový instalátor balíčků. Pokud se aktualizace nenainstalují, zkuste použít starší možnost. Mezipaměť Epizoda %d bude vydána za - %dh %dm + %1$dh %2$dm Přehrát přímý přenos Rozšíření Akce @@ -436,7 +436,7 @@ Co chcete vidět Doplněk stažen 18+ - Spuštěno stahování %d %s… + Spuštěno stahování %1$d %2$s… CloudStream nemá ve výchozím nastavení nainstalované žádné weby. Stránky je třeba nainstalovat z úložišť. \n \nKvůli nesmyslnému podání stížnosti DMCA společností Sky UK Limited 🤮 nemůžeme v aplikaci propojit stránky repozitářů. @@ -505,12 +505,12 @@ Aktualizace aplikace Hotovo Podporováno - %s %d%s + %1$s %2$d%3$s Živý přenos NSFW Rozšíření Přehrát trailer - %dd %dh %dm + %1$dd %2$dh %3$dm Zobrazit komunitní repozitáře Aktualizace zahájena Stream @@ -520,7 +520,7 @@ Referent Další Sledovat videa v těchto jazycích - Staženo %d %s + Staženo %1$d %2$s Všechny %s jsou již staženy Hromadné stahování doplněk @@ -575,4 +575,31 @@ V repozitáři nebyly nalezeny žádné doplňky Repozitář nenalezen, zkontrolujte adresu URL a zkuste použít VPN Již jste hlasovali - + %s odebráno z oblíbených + Oblíbené + %s přidáno do oblíbených + Ve vaší knihovně byl nalezen potenciální duplikát: +\n +\n%s +\n +\nChcete přesto přidat tuto položku, nahradit existující nebo zrušit akci\? + Frekvence záloh + Nalezena potenciální duplicita + Zamknout profil + Přidat do oblíbených + Nahradit vše + Nesprávný PIN. Zkuste to prosím znovu. + Zrušit odběr + PIN musí obsahovat 4 znaky + Nahradit + Přidat + Odebírat + Odebrat z oblíbených + Vyberte účet + Vypadá to, že ve vaší knihovně již existuje potenciální duplikát: „%1$s“. +\n +\nChcete přesto přidat tuto položku, nahradit existující nebo zrušit akci\? + Zadejte PIN + PIN + Zadejte současný PIN + \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 69086840..e292e0ba 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -4,10 +4,10 @@ Descargue la lista de sitios que quiera utilizar Descargado:%d Descargado - Descargado %d %s + Descargado %1$d %2$s Borrar repositorio El episodio %d se lanzará en - %dh %dm + %1$dh %2$dm %dm Poster Extensiones @@ -97,12 +97,12 @@ Poster Siguiente al azar Todos los Idiomas - Volver + Regresar Cambiar proveedor Vista previa del fondo Nota:%.1f - Nueva actualización encontrada! -\n%s -> %s + ¡Nueva actualización encontrada! +\n%1$s -> %2$s Descargar Pausar Descarga Formato de fuente @@ -110,8 +110,8 @@ Tamaño de Fuente Velocidad (%.2fx) Omitir carga - %s Ep %d - %dd %dh %dm + %1$s Ep. %2$d + %1$dd %2$dh %3$dm Elenco %s Relleno %d min @@ -145,7 +145,7 @@ Transmitir Torrent Fuentes Reintentar conexión… - Volver + Regresar Descargando Descarga pausada Descarga iniciada @@ -218,8 +218,8 @@ Reproducir Episodio Episodio Episodios - %d-%d - %d %s + %1$d-%2$d + %1$d %2$s E Falló la restauración de los datos desde el archivo %s Datos guardados @@ -233,7 +233,7 @@ Mostrar los resultados de la búsqueda por proveedor Solo envíar los datos si la App se cierra / falla inesperadamente No enviar datos - Mostrar Trailers (avances) + Mostrar los trailers Mostrar pósters de Kitsu Actualizar a las versiones preliminares Buscar actualizaciones preliminares (beta) en lugar de solo versiones completas (stable releases) @@ -249,7 +249,7 @@ Reiniciar a valores predefinidos Lo sentimos, la aplicación se bloqueó. Se enviará un informe de error anónimo a los desarrolladores Temporada - %s %d%s + %1$s %2$d%3$s Ninguna Temporada T Borrar Archivo @@ -311,7 +311,7 @@ Cambiar cuenta Añadir cuenta Sincronizar - Calificación + Clasificado %s autenticado No se pudo autenticar a %s Recomendado @@ -345,7 +345,7 @@ Color primario Tema de la aplicación hola@mundo.com - %s %s + %1$s %2$s Todo 1000ms Sin retraso de subtítulos @@ -448,7 +448,7 @@ Hecho Plugin Cargado 18+ - Iniciada la descarga %d %s… + Comenzó la descarga de %1$d %2$s… Descarga por lotes plugin plugins @@ -552,4 +552,30 @@ Repositorio no encontrado, comprueba la URL y prueba la VPN Ya has votado Frecuencia de la copia de seguridad - + %s eliminado de favoritos + Favoritos + %s añadido a favoritos + Se han encontrado posibles elementos duplicados en su biblioteca: +\n +\n%s +\n +\n¿Desea añadir este elemento de todos modos, sustituir los existentes o cancelar la acción\? + Posible duplicado encontrado + Perfil de bloqueo + Añadido a favoritos + Sustituir todo + PIN incorrecto. Por favor, inténtelo de nuevo. + Cancelar la suscripción + El PIN debe tener 4 caracteres + Sustituir + Añadir + Suscríbase + Eliminar de favoritos + Seleccione una cuenta + Parece que ya existe un elemento potencialmente duplicado en su biblioteca: \'%s.\' +\n +\n¿Desea añadir este elemento de todos modos, sustituir el existente o cancelar la acción\? + Introducir el PIN + PIN + Introduzca el PIN actual + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 933ac77f..72db056c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -20,7 +20,7 @@ Velocità (%.2fx) Valutato: %.1f Nuovo aggiornamento trovato! -\n%s -> %s +\n%1$s -> %2$s Filler %d min @@ -409,8 +409,8 @@ Plugin eliminato Impossibile caricare %s 18+ - Download iniziato %d %s… - Scaricato %d %s + Download iniziato %1$d %2$s… + Scaricato %1$d %2$s Tutti %s già scaricati Download in blocco plugin @@ -573,4 +573,30 @@ Seleziona la modalità per filtrare il download dei plugin Disabilita Hai già votato - + %s rimosso dai preferiti + Preferiti + %s aggiunto ai preferiti + Dei possibili duplicati sono stati trovati nella tua libreria: +\n +\n%s +\n +\nVorresti aggiungere l\'oggetto alla libreria comunque, rimpiazzare l\'esistente, o cancellare l\'azione\? + Frequenza di backup + Trovato Possibile Duplicato + Aggiungi ai preferiti + Rimpiazza tutti + PIN non corretto. Riprova. + Disiscriviti + Il PIN deve essere almeno di 4 caratteri + Rimpiazza + Aggiungi + Iscriviti + Rimuovi dai preferiti + Seleziona un Account + Sembra che un oggetto potenziale duplicato sia già presente nella tua libreria: \'%1$s.\' +\n +\nVorresti aggiungere l\'oggetto lo stesso, rimpiazzare l\'esistente, o cancellare l\'azione\? + Inserisci PIN + PIN + Inserisci PIN Corrente + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 57b128de..c53de272 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -9,16 +9,16 @@ Актори: %s Епізод %d вийде через Poster - %s Еп. %d - %dд %dгод %dхв - %dгод %dхв + %1$s Еп. %2$d + %1$dд %2$dгод %3$dхв + %1$dгод %2$dхв %dхв Головний постер Наступний випадковий Попередній перегляд фону Швидкість (%.2fx) Знайдено нове оновлення! -\n%s –> %s +\n%1$s –> %2$s Пошук Завантаження %d хв @@ -112,7 +112,7 @@ Переглянути файл Детальніше Фільтр закладок - Очистити + Очистити Налаштування субтитрів Колір фону Висота субтитрів @@ -167,7 +167,7 @@ Скинути до значення за замовчуванням Немає сезону епізодів - %d %s + %1$d %2$s С Е Видалити файл @@ -238,9 +238,9 @@ Рік +30 Вибачте, у застосунку стався збій. Анонімне повідомлення про помилку буде відправлено розробникам - %s %d%s + %1$s %2$d%3$s Епізод - %d-%d + %1$d-%2$d Епізодів не знайдено Пауза Сезон @@ -364,7 +364,7 @@ Макет Постачальники example.com - %s %s + %2$s %1$s Депресивний обліковий запис Створити @@ -414,8 +414,8 @@ Плагін завантажено Плагін завантажено Не вдалося завантажити %s - Почалося завантаження %d %s… - Завантажено %d %s + Почалося завантаження %1$d %2$s… + Завантажено %1$d %2$s Всі %s вже завантажено Завантажити пакети плагін @@ -499,7 +499,7 @@ Ваша бібліотека порожня :( \nУвійдіть в обліковий запис бібліотеки або додайте фільми до вашої локальної бібліотеки. Алфавітом (від Я до А) - Виберіть бібліотеку + Оберіть бібліотеку Відкрити Браузер Цей список порожній. Спробуйте перейти до іншого. @@ -546,10 +546,36 @@ Якості Фон профілю Не вдалося створити UI коректно, це ВАЖЛИВА ПОМИЛКА, про яку слід негайно повідомити %s - Виберіть режим для фільтрації завантаження плагінів + Оберіть режим для фільтрації завантаження плагінів Вимкнути Репозиторій не знайдено, перевірте URL-адресу та спробуйте VPN Не знайдено жодних плагінів у репозиторії Ви вже проголосували Частота резервного копіювання - + %s вилучено з обраного + Обране + %s додано до обраного + У вашій бібліотеці знайдено потенційні дублікати: +\n +\n%s +\n +\nВсе одно хочете додати цей елемент, замінити наявні чи скасувати дію\? + Знайдено потенційний дублікат + Розблокувати профіль + Додати до обраного + Замінити усе + Неправильний PIN-код. Спробуйте ще раз. + Відписатись + PIN-код повинен складатися з 4 символів + Замінити + Додати + Підписатись + Вилучити з обраного + Оберіть обліковий запис + Виявилося, що у вашій бібліотеці вже є потенційно повторюваний елемент: \'%1$s.\' +\n +\nВсе одно хочете додати цей елемент, замінити наявний чи скасувати дію\? + Введіть PIN-код + PIN-код + Введіть поточний PIN-код + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 8186d6ed..81575604 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -409,8 +409,8 @@ Plugin đã xoá Không tải được %s 18+ - Bắt đầu tải %d %s… - Tải xuống %d %s thành công + Đã bắt đầu tải xuống %1$d %2$s… + Đã tải xuống %1$d %2$s Toàn bộ %s đã được tải xuống Tải hàng loạt plugin @@ -566,4 +566,31 @@ Không tìm thấy plugin Không thể khởi tạo UI, đây là một LỖI LỚN và cần được báo cáo ngay lập tức tới %s Chọn chế độ để lọc plugin tải xuống - + %s đã loại bỏ khỏi mục yêu thích + Yêu thích + %s đã thêm vào mục yêu thích + Các mục có thể trùng lặp đã được tìm thấy trong thư viện của bạn: +\n +\n%s +\n +\nBạn vẫn muốn thêm mục này, thay thế những mục hiện có hay hủy hành động\? + Tần suất sao lưu + Đã tìm thấy bản sao tiềm năng + Khóa hồ sơ + Thêm vào mục yêu thích + Thay thế tất cả + Mã PIN không chính xác. Vui lòng thử lại. + Hủy đăng ký + Mã PIN phải có 4 ký tự + Thay thế + Thêm vào + Đăng ký + Loại bỏ khỏi mục yêu thích + Chọn một tài khoản + Có vẻ như một mục có khả năng trùng lặp đã tồn tại trong thư viện của bạn: \'%1$s.\' +\n +\nBạn vẫn muốn thêm mục này, thay thế mục hiện có hay hủy hành động\? + Nhập PIN + PIN + Nhập mã PIN hiện tại + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 351315f4..9e0575da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -701,9 +701,9 @@ Add Replace Replace All - @string/sort_cancel - - It appears that a potentially duplicate item already exists in your library: \'%1$s.\' + @string/cancel + + It appears that a potentially duplicate item already exists in your library: \'%s.\' \n\nWould you like to add this item anyway, replace the existing one, or cancel the action? diff --git a/fastlane/metadata/android/es-ES/changelogs/2.txt b/fastlane/metadata/android/es-ES/changelogs/2.txt new file mode 100644 index 00000000..68e0b99b --- /dev/null +++ b/fastlane/metadata/android/es-ES/changelogs/2.txt @@ -0,0 +1 @@ +- ¡Cambios añadidos! diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt new file mode 100644 index 00000000..9f6accba --- /dev/null +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -0,0 +1,10 @@ +CloudStream-3 te permite ver y descargar películas, series de TV y anime. + +La aplicación viene sin ningún tipo de anuncios y análisis y +soporta múltiples tráilers y páginas de películas, y más, por ejemplo + +Marcadores + +Descargas de subtítulos + +Compatible con Chromecast diff --git a/fastlane/metadata/android/es-ES/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt new file mode 100644 index 00000000..eb1d11e8 --- /dev/null +++ b/fastlane/metadata/android/es-ES/short_description.txt @@ -0,0 +1 @@ +Vea y descargue películas, series de televisión y anime. diff --git a/fastlane/metadata/android/es-ES/title.txt b/fastlane/metadata/android/es-ES/title.txt new file mode 100644 index 00000000..dde89d58 --- /dev/null +++ b/fastlane/metadata/android/es-ES/title.txt @@ -0,0 +1 @@ +CloudStream From 6f40d2750f1ae5b04aa4c75a93e6ef1baedeea1b Mon Sep 17 00:00:00 2001 From: "recloudstream[bot]" <111277985+recloudstream[bot]@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:59:11 +0000 Subject: [PATCH 03/20] chore(locales): fix locale issues --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 15d22412..56e19280 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -610,4 +610,4 @@ ادخال ال PIN PIN أدخل ال PIN الحالي - \ No newline at end of file + diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ae93803d..275553a9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -602,4 +602,4 @@ Zadejte PIN PIN Zadejte současný PIN - \ No newline at end of file + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e292e0ba..32e2b61d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -578,4 +578,4 @@ Introducir el PIN PIN Introduzca el PIN actual - \ No newline at end of file + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 72db056c..d6be0eed 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -599,4 +599,4 @@ Inserisci PIN PIN Inserisci PIN Corrente - \ No newline at end of file + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c53de272..425c5257 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -578,4 +578,4 @@ Введіть PIN-код PIN-код Введіть поточний PIN-код - \ No newline at end of file + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 81575604..d27660c7 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -593,4 +593,4 @@ Nhập PIN PIN Nhập mã PIN hiện tại - \ No newline at end of file + From 908f83c50ea960b939ab2d7561a66eff180e0c6e Mon Sep 17 00:00:00 2001 From: KingLucius Date: Thu, 2 Nov 2023 22:03:00 +0200 Subject: [PATCH 04/20] Fix scroll for Library TV layout (#695) * Fix scroll for Library TV layout * Fixed without NestedScrollView --- .../ui/library/LibraryFragment.kt | 10 ++++++++ .../ui/library/ViewpagerAdapter.kt | 17 +++++++++++-- .../main/res/layout/fragment_library_tv.xml | 25 ++++++++++--------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt index 7cc57f5d..864ca065 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/library/LibraryFragment.kt @@ -27,6 +27,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.viewpager2.widget.ViewPager2 import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.appbar.AppBarLayout import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import com.lagradost.cloudstream3.APIHolder @@ -137,6 +138,10 @@ class LibraryFragment : Fragment() { binding?.libraryRoot?.findViewById(R.id.search_src_text)?.apply { tag = "tv_no_focus_tag" + //Expand the Appbar when search bar is focused, fixing scroll up issue + setOnFocusChangeListener { _, _ -> + binding?.searchBar?.setExpanded(true) + } } // Set the color for the search exit icon to the correct theme text color @@ -342,6 +347,7 @@ class LibraryFragment : Fragment() { binding?.apply { viewpager.offscreenPageLimit = 2 viewpager.reduceDragSensitivity() + searchBar.setExpanded(true) } val startLoading = Runnable { @@ -441,6 +447,10 @@ class LibraryFragment : Fragment() { val distance = abs(position - currentItem) hideViewpager(distance) } + //Expand the appBar on tab focus + tab.view.setOnFocusChangeListener { view, b -> + binding?.searchBar?.setExpanded(true) + } }.attach() } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/library/ViewpagerAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/library/ViewpagerAdapter.kt index 76028487..6731eae2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/library/ViewpagerAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/library/ViewpagerAdapter.kt @@ -1,14 +1,18 @@ package com.lagradost.cloudstream3.ui.library import android.os.Build +import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.doOnAttach import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnFlingListener +import com.google.android.material.appbar.AppBarLayout +import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.LibraryViewpagerPageBinding import com.lagradost.cloudstream3.syncproviders.SyncAPI import com.lagradost.cloudstream3.ui.search.SearchClickCallback +import com.lagradost.cloudstream3.ui.settings.SettingsFragment import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount class ViewpagerAdapter( @@ -67,6 +71,17 @@ class ViewpagerAdapter( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { setOnScrollChangeListener { _, _, scrollY, _, oldScrollY -> val diff = scrollY - oldScrollY + + //Expand the top Appbar based on scroll direction up/down, simulate phone behavior + if (SettingsFragment.isTvSettings()) { + binding.root.rootView.findViewById(R.id.search_bar) + .apply { + if (diff <= 0) + setExpanded(true) + else + setExpanded(false) + } + } if (diff == 0) return@setOnScrollChangeListener scrollCallback.invoke(diff > 0) @@ -80,8 +95,6 @@ class ViewpagerAdapter( } } } - - } } diff --git a/app/src/main/res/layout/fragment_library_tv.xml b/app/src/main/res/layout/fragment_library_tv.xml index 22b9feb1..6d2198e9 100644 --- a/app/src/main/res/layout/fragment_library_tv.xml +++ b/app/src/main/res/layout/fragment_library_tv.xml @@ -27,7 +27,8 @@ android:id="@+id/search_status_bar_padding" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal"> + android:orientation="horizontal" + app:layout_scrollFlags="scroll|enterAlways"> + - + - Date: Fri, 3 Nov 2023 01:37:34 +0530 Subject: [PATCH 05/20] bump navigation lib (#749) --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b82d26e1..e0e4bb1d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -164,8 +164,8 @@ dependencies { implementation("com.google.android.material:material:1.10.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.navigation:navigation-fragment-ktx:2.7.4") - implementation("androidx.navigation:navigation-ui-ktx:2.7.4") + implementation("androidx.navigation:navigation-fragment-ktx:2.7.5") + implementation("androidx.navigation:navigation-ui-ktx:2.7.5") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") From 5b0cbbf09f7632af4eea8c14265e2859d0cf6f6b Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Thu, 2 Nov 2023 14:14:16 -0600 Subject: [PATCH 06/20] Use nicer grid layout for account select on TV (#737) --- .../cloudstream3/ui/account/AccountAdapter.kt | 8 ------ .../ui/account/AccountSelectActivity.kt | 18 ++++++------- .../res/layout/activity_account_select.xml | 2 +- .../res/layout/activity_account_select_tv.xml | 27 ------------------- 4 files changed, 10 insertions(+), 45 deletions(-) delete mode 100644 app/src/main/res/layout/activity_account_select_tv.xml diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountAdapter.kt index 72551199..aea55392 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountAdapter.kt @@ -43,14 +43,6 @@ class AccountAdapter( LayoutInflater.from(parent.context), parent, false ) - if (isTvSettings()) { - val layoutParams = binding.root.layoutParams as RecyclerView.LayoutParams - val marginInDp = 5 // Set the margin to 5dp - val marginInPixels = (marginInDp * parent.resources.displayMetrics.density).toInt() - layoutParams.setMargins(marginInPixels, marginInPixels, marginInPixels, marginInPixels) - binding.root.layoutParams = layoutParams - } - return AccountViewHolder(binding) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt index a2c34bf0..457d4b81 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt @@ -4,14 +4,12 @@ import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.lagradost.cloudstream3.CommonActivity import com.lagradost.cloudstream3.CommonActivity.loadThemes import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.ActivityAccountSelectBinding -import com.lagradost.cloudstream3.databinding.ActivityAccountSelectTvBinding import com.lagradost.cloudstream3.ui.account.AccountDialog.showPinInputDialog import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings import com.lagradost.cloudstream3.utils.DataStoreHelper @@ -36,13 +34,11 @@ class AccountSelectActivity : AppCompatActivity() { window.navigationBarColor = colorFromAttribute(R.attr.primaryBlackBackground) - val binding = if (isTvSettings()) { - ActivityAccountSelectTvBinding.inflate(layoutInflater) - } else ActivityAccountSelectBinding.inflate(layoutInflater) + val binding = ActivityAccountSelectBinding.inflate(layoutInflater) setContentView(binding.root) - val recyclerView: RecyclerView = binding.root.findViewById(R.id.account_recycler_view) + val recyclerView: RecyclerView = binding.accountRecyclerView val adapter = AccountAdapter(accounts) { selectedAccount -> @@ -51,9 +47,13 @@ class AccountSelectActivity : AppCompatActivity() { } recyclerView.adapter = adapter - recyclerView.layoutManager = if (isTvSettings()) { - LinearLayoutManager(this) - } else GridLayoutManager(this, 2) + if (isTvSettings()) { + val spanSize = if (accounts.count() <= 6) { + accounts.count() + } else 6 + + recyclerView.layoutManager = GridLayoutManager(this, spanSize) + } } private fun onAccountSelected(selectedAccount: DataStoreHelper.Account) { diff --git a/app/src/main/res/layout/activity_account_select.xml b/app/src/main/res/layout/activity_account_select.xml index 9138f82d..d5870f24 100644 --- a/app/src/main/res/layout/activity_account_select.xml +++ b/app/src/main/res/layout/activity_account_select.xml @@ -17,7 +17,7 @@ android:layout_marginTop="16dp" android:layout_marginBottom="16dp" /> - - - - - - - - - \ No newline at end of file From a6786aaf9860df0992e704bc3b3f1bed50360203 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Thu, 2 Nov 2023 17:28:25 -0600 Subject: [PATCH 07/20] Add done button for when creating new PINs (#742) * Add done button for when creating new PINs * Cleanup --- .../cloudstream3/ui/account/AccountDialog.kt | 101 ++++++++++-------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountDialog.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountDialog.kt index dfd8831b..76686aef 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountDialog.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountDialog.kt @@ -1,18 +1,17 @@ package com.lagradost.cloudstream3.ui.account import android.content.Context -import android.text.Editable -import android.text.TextWatcher import android.view.LayoutInflater -import android.view.View import android.view.inputmethod.EditorInfo -import android.view.inputmethod.InputMethodManager import android.widget.TextView import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible +import androidx.core.widget.doOnTextChanged import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.databinding.LockPinDialogBinding import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe +import com.lagradost.cloudstream3.utils.UIHelper.showInputMethod object AccountDialog { // TODO add account creation dialog to allow creating accounts directly from AccountSelectActivity @@ -21,14 +20,18 @@ object AccountDialog { context: Context, currentPin: String?, editAccount: Boolean, + errorText: String? = null, callback: (String?) -> Unit ) { fun TextView.visibleWithText(@StringRes textRes: Int) { - visibility = View.VISIBLE + isVisible = true setText(textRes) } - fun View.isVisible() = visibility == View.VISIBLE + fun TextView.visibleWithText(text: String?) { + isVisible = true + setText(text) + } val binding = LockPinDialogBinding.inflate(LayoutInflater.from(context)) @@ -38,7 +41,9 @@ object AccountDialog { val titleRes = if (isEditPin) R.string.enter_current_pin else R.string.enter_pin - val dialog = AlertDialog.Builder(context, R.style.AlertDialogCustom) + var isPinValid = false + + val builder = AlertDialog.Builder(context, R.style.AlertDialogCustom) .setView(binding.root) .setTitle(titleRes) .setNegativeButton(R.string.cancel) { _, _ -> @@ -48,46 +53,59 @@ object AccountDialog { callback.invoke(null) } .setOnDismissListener { - if (binding.pinEditTextError.isVisible()) { + if (!isPinValid) { callback.invoke(null) } } - .create() - var isPinValid = false - - binding.pinEditText.addTextChangedListener(object : TextWatcher { - override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} - - override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { - val enteredPin = s.toString() - val isEnteredPinValid = enteredPin.length == 4 - - if (isEnteredPinValid) { - if (isPinSet) { - if (enteredPin != currentPin) { - binding.pinEditTextError.visibleWithText(R.string.pin_error_incorrect) - binding.pinEditText.text = null - isPinValid = false - } else { - binding.pinEditTextError.visibility = View.GONE - isPinValid = true - - callback.invoke(enteredPin) - dialog.dismissSafe() - } - } else { - binding.pinEditTextError.visibility = View.GONE - isPinValid = true - } - } else if (isNewPin) { - binding.pinEditTextError.visibleWithText(R.string.pin_error_length) - isPinValid = false + if (isNewPin) { + if (errorText != null) binding.pinEditTextError.visibleWithText(errorText) + builder.setPositiveButton(R.string.setup_done) { _, _ -> + if (!isPinValid) { + // If the done button is pressed and there is an error, + // ask again, and mention the error that caused this. + showPinInputDialog( + context = binding.root.context, + currentPin = null, + editAccount = true, + errorText = binding.pinEditTextError.text.toString(), + callback = callback + ) + } else { + val enteredPin = binding.pinEditText.text.toString() + callback.invoke(enteredPin) } } + } - override fun afterTextChanged(s: Editable?) {} - }) + val dialog = builder.create() + + binding.pinEditText.doOnTextChanged { text, _, _, _ -> + val enteredPin = text.toString() + val isEnteredPinValid = enteredPin.length == 4 + + if (isEnteredPinValid) { + if (isPinSet) { + if (enteredPin != currentPin) { + binding.pinEditTextError.visibleWithText(R.string.pin_error_incorrect) + binding.pinEditText.text = null + isPinValid = false + } else { + binding.pinEditTextError.isVisible = false + isPinValid = true + + callback.invoke(enteredPin) + dialog.dismissSafe() + } + } else { + binding.pinEditTextError.isVisible = false + isPinValid = true + } + } else if (isNewPin) { + binding.pinEditTextError.visibleWithText(R.string.pin_error_length) + isPinValid = false + } + } // Detect IME_ACTION_DONE binding.pinEditText.setOnEditorActionListener { _, actionId, _ -> @@ -108,8 +126,7 @@ object AccountDialog { // Auto focus on PIN input and show keyboard binding.pinEditText.requestFocus() binding.pinEditText.postDelayed({ - val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - imm.showSoftInput(binding.pinEditText, InputMethodManager.SHOW_IMPLICIT) + showInputMethod(binding.pinEditText) }, 200) } } \ No newline at end of file From 11136fe63d494ac800df3a52560237500ca024a3 Mon Sep 17 00:00:00 2001 From: self-similarity <137652432+self-similarity@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:33:11 +0000 Subject: [PATCH 08/20] Fix selecting sources in cast (#752) --- .../java/com/lagradost/cloudstream3/utils/ExtractorApi.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt index d89e67fa..923c3531 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -1,6 +1,7 @@ package com.lagradost.cloudstream3.utils import android.net.Uri +import com.fasterxml.jackson.annotation.JsonIgnore import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.USER_AGENT @@ -377,7 +378,8 @@ open class ExtractorLink constructor( ) : VideoDownloadManager.IDownloadableMinimum { val isM3u8 : Boolean get() = type == ExtractorLinkType.M3U8 val isDash : Boolean get() = type == ExtractorLinkType.DASH - + + @JsonIgnore fun getAllHeaders() : Map { if (referer.isBlank()) { return headers @@ -920,4 +922,4 @@ abstract class ExtractorApi { open fun getExtractorUrl(id: String): String { return id } -} \ No newline at end of file +} From 22a0c25d8309097efbe92ac6af945e8438307b60 Mon Sep 17 00:00:00 2001 From: Sofie <117321707+Sofie99@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:28:27 +0700 Subject: [PATCH 09/20] extractor: fixed Rabbitstream (#757) * Extractor: added Rabbitstream * Extractor: added Rabbitstream * fixed Rabbitstream --------- Co-authored-by: Sofie99 --- .../cloudstream3/extractors/Rabbitstream.kt | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Rabbitstream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Rabbitstream.kt index 0154b4e8..d5b52dd7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Rabbitstream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Rabbitstream.kt @@ -16,13 +16,13 @@ import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec -// No License found in https://github.com/enimax-anime/key -// special credits to @enimax for providing key +// Code found in https://github.com/theonlymo/keys +// special credits to @theonlymo for providing key class Megacloud : Rabbitstream() { override val name = "Megacloud" override val mainUrl = "https://megacloud.tv" override val embed = "embed-2/ajax/e-1" - override val key = "https://raw.githubusercontent.com/enimax-anime/key/e6/key.txt" + override val key = "https://raw.githubusercontent.com/theonlymo/keys/e1/key" } class Dokicloud : Rabbitstream() { @@ -35,7 +35,7 @@ open class Rabbitstream : ExtractorApi() { override val mainUrl = "https://rabbitstream.net" override val requiresReferer = false open val embed = "ajax/embed-4" - open val key = "https://raw.githubusercontent.com/enimax-anime/key/e4/key.txt" + open val key = "https://raw.githubusercontent.com/theonlymo/keys/e4/key" override suspend fun getUrl( url: String, @@ -86,21 +86,23 @@ open class Rabbitstream : ExtractorApi() { private suspend fun getRawKey(): String = app.get(key).text - private fun extractRealKey(originalString: String?, stops: String): Pair { - val table = parseJson>>(stops) - val decryptedKey = StringBuilder() - var offset = 0 - var encryptedString = originalString + private fun extractRealKey(sources: String, stops: String): Pair { + val decryptKey = parseJson>>(stops) + val sourcesArray = sources.toCharArray() - table.forEach { (start, end) -> - decryptedKey.append(encryptedString?.substring(start - offset, end - offset)) - encryptedString = encryptedString?.substring( - 0, - start - offset - ) + encryptedString?.substring(end - offset) - offset += end - start + var extractedKey = "" + var currentIndex = 0 + for (index in decryptKey) { + val start = index[0] + currentIndex + val end = start + index[1] + for (i in start until end) { + extractedKey += sourcesArray[i].toString() + sourcesArray[i] = ' ' + } + currentIndex += index[1] } - return decryptedKey.toString() to encryptedString.toString() + + return extractedKey to sourcesArray.joinToString("") } private inline fun decryptMapped(input: String, key: String): T? { From 7e2908c0bbd3fd242cd4576b58039cfe01a378b0 Mon Sep 17 00:00:00 2001 From: KingLucius Date: Fri, 10 Nov 2023 16:36:38 +0200 Subject: [PATCH 10/20] Fix top bar in Extensions & Test settings (#753) --- .../cloudstream3/ui/settings/SettingsFragment.kt | 9 +++++++++ .../ui/settings/extensions/ExtensionsFragment.kt | 3 ++- .../ui/settings/extensions/PluginsFragment.kt | 2 ++ .../cloudstream3/ui/settings/testing/TestFragment.kt | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index cb48b086..6ea6363e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -65,6 +65,15 @@ class SettingsFragment : Fragment() { } } } + fun Fragment?.setToolBarScrollFlags() { + if (isTvSettings()) { + val settingsAppbar = this?.view?.findViewById(R.id.settings_toolbar) + + settingsAppbar?.updateLayoutParams { + scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL + } + } + } fun Fragment?.setUpToolbar(title: String) { if (this == null) return val settingsToolbar = view?.findViewById(R.id.settings_toolbar) ?: return diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index 553e7675..f0b8a0bd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -30,6 +30,7 @@ import com.lagradost.cloudstream3.ui.result.FOCUS_SELF import com.lagradost.cloudstream3.ui.result.setLinearListLayout import com.lagradost.cloudstream3.ui.result.setText import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.utils.AppUtils.downloadAllPluginsDialog import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus @@ -85,7 +86,7 @@ class ExtensionsFragment : Fragment() { //context?.fixPaddingStatusbar(extensions_root) setUpToolbar(R.string.extensions) - + setToolBarScrollFlags() binding?.repoRecyclerView?.apply { setLinearListLayout( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt index 172ea659..b490386f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt @@ -18,6 +18,7 @@ import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.bindChips import com.lagradost.cloudstream3.ui.result.FOCUS_SELF import com.lagradost.cloudstream3.ui.result.setLinearListLayout import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar import com.lagradost.cloudstream3.ui.settings.appLanguages import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog @@ -73,6 +74,7 @@ class PluginsFragment : Fragment() { return } + setToolBarScrollFlags() setUpToolbar(name) binding?.settingsToolbar?.apply { setOnMenuItemClickListener { menuItem -> diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/testing/TestFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/testing/TestFragment.kt index 59b1b856..3fbd1131 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/testing/TestFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/testing/TestFragment.kt @@ -12,6 +12,7 @@ import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.mvvm.observeNullable import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings +import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar @@ -27,6 +28,7 @@ class TestFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { setUpToolbar(R.string.category_provider_test) + setToolBarScrollFlags() super.onViewCreated(view, savedInstanceState) binding?.apply { From c4aab5e5a827a051dd089c568dcb1d22d0215c42 Mon Sep 17 00:00:00 2001 From: IndusAryan <125901294+IndusAryan@users.noreply.github.com> Date: Fri, 10 Nov 2023 21:32:51 +0530 Subject: [PATCH 11/20] feat: make cloudstream fast boi, ksp migration (#689) * migrate from kapt to ksp * fook codefactor --- app/build.gradle.kts | 19 +++++++++++++------ .../lagradost/cloudstream3/AcraApplication.kt | 3 --- .../ui/settings/extensions/PluginAdapter.kt | 3 +-- .../lagradost/cloudstream3/utils/UIHelper.kt | 4 ++-- .../utils/VideoDownloadManager.kt | 2 +- build.gradle.kts | 4 ++++ 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e0e4bb1d..12859af5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,7 @@ import java.net.URL plugins { id("com.android.application") + id("com.google.devtools.ksp") id("kotlin-android") id("kotlin-kapt") id("org.jetbrains.dokka") @@ -87,6 +88,11 @@ android { ) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + arg("exportSchema", "true") + } + kapt { includeCompileClasspath = true } @@ -181,9 +187,13 @@ dependencies { implementation("androidx.preference:preference-ktx:1.2.1") - implementation("com.github.bumptech.glide:glide:4.13.1") - kapt("com.github.bumptech.glide:compiler:4.13.1") - implementation("com.github.bumptech.glide:okhttp3-integration:4.13.0") + implementation("com.github.bumptech.glide:glide:4.15.1") + ksp("com.github.bumptech.glide:ksp:4.15.1") + implementation("com.github.bumptech.glide:okhttp3-integration:4.15.1") + // for ksp + ksp("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") + implementation("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") + implementation("com.google.guava:guava:32.1.2-android") implementation("jp.wasabeef:glide-transformations:4.3.0") @@ -207,9 +217,6 @@ dependencies { implementation("ch.acra:acra-core:5.11.2") implementation("ch.acra:acra-toast:5.11.2") - compileOnly("com.google.auto.service:auto-service-annotations:1.1.1") - //either for java sources: - annotationProcessor("com.google.auto.service:auto-service:1.1.1") //or for kotlin sources (requires kapt gradle plugin): kapt("com.google.auto.service:auto-service:1.1.1") diff --git a/app/src/main/java/com/lagradost/cloudstream3/AcraApplication.kt b/app/src/main/java/com/lagradost/cloudstream3/AcraApplication.kt index 5f3162b4..c93f0f9b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/AcraApplication.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/AcraApplication.kt @@ -8,7 +8,6 @@ import android.content.Intent import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import com.google.auto.service.AutoService import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall import com.lagradost.cloudstream3.plugins.PluginManager @@ -37,7 +36,6 @@ import java.lang.ref.WeakReference import kotlin.concurrent.thread import kotlin.system.exitProcess - class CustomReportSender : ReportSender { // Sends all your crashes to google forms override fun send(context: Context, errorContent: CrashReportData) { @@ -65,7 +63,6 @@ class CustomReportSender : ReportSender { } } -@AutoService(ReportSenderFactory::class) class CustomSenderFactory : ReportSenderFactory { override fun create(context: Context, config: CoreConfiguration): ReportSender { return CustomReportSender() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt index eb0082b8..c3fb4fc2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginAdapter.kt @@ -21,7 +21,6 @@ import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueT import com.lagradost.cloudstream3.utils.AppUtils.html import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.main -import com.lagradost.cloudstream3.utils.GlideApp import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso import com.lagradost.cloudstream3.utils.UIHelper.setImage @@ -87,7 +86,7 @@ class PluginAdapter( override fun onViewRecycled(holder: RecyclerView.ViewHolder) { if (holder is PluginViewHolder) { holder.binding.entryIcon.let { pluginIcon -> - GlideApp.with(pluginIcon).clear(pluginIcon) + com.bumptech.glide.Glide.with(pluginIcon).clear(pluginIcon) } } super.onViewRecycled(holder) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt index d5357e0c..231a634d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt @@ -301,7 +301,7 @@ object UIHelper { } ?: return false return try { - var builder = GlideApp.with(this) + var builder = com.bumptech.glide.Glide.with(this) .load(glideImage) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.ALL).let { req -> @@ -368,7 +368,7 @@ object UIHelper { ) { if (this == null || url.isNullOrBlank()) return try { - val res = GlideApp.with(this) + val res = com.bumptech.glide.Glide.with(this) .load(GlideUrl(url) { headers ?: emptyMap() }) .apply(bitmapTransform(BlurTransformation(radius, sample))) .transition( diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt index d108daed..50a8df02 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/VideoDownloadManager.kt @@ -234,7 +234,7 @@ object VideoDownloadManager { return cachedBitmaps[url] } - val bitmap = GlideApp.with(this) + val bitmap = com.bumptech.glide.Glide.with(this) .asBitmap() .load(GlideUrl(url) { headers ?: emptyMap() }) .into(720, 720) diff --git a/build.gradle.kts b/build.gradle.kts index 762e4588..5d7ea527 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,10 @@ allprojects { } } +plugins { + id("com.google.devtools.ksp") version "1.8.20-1.0.11" apply false +} + tasks.register("clean", Delete::class) { delete(rootProject.buildDir) } \ No newline at end of file From 3adf036135d7e4776a4cd8ac0aa1cb8a582a9c0a Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Nov 2023 16:48:53 -0700 Subject: [PATCH 12/20] Fix some deprecations and other warnings (#750) * Fix some deprecations and other warnings --- app/src/main/AndroidManifest.xml | 16 ++-- .../lagradost/cloudstream3/MainActivity.kt | 75 ++++++++++++------- .../ui/download/DownloadChildFragment.kt | 6 +- .../ui/player/DownloadedPlayerActivity.kt | 14 +++- .../ui/result/ResultTrailerPlayer.kt | 37 ++++++--- .../ui/settings/SettingsFragment.kt | 4 +- .../ui/settings/extensions/PluginsFragment.kt | 4 +- .../cloudstream3/utils/IOnBackPressed.kt | 5 -- .../lagradost/cloudstream3/utils/UIHelper.kt | 4 +- .../main/res/xml/data_extraction_rules.xml | 3 + 10 files changed, 106 insertions(+), 62 deletions(-) delete mode 100644 app/src/main/java/com/lagradost/cloudstream3/utils/IOnBackPressed.kt create mode 100644 app/src/main/res/xml/data_extraction_rules.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 453c1fae..a71c5ecb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ - + @@ -17,7 +17,11 @@ - + + + + tools:targetApi="tiramisu"> - + android:exported="false"> + diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index a41028bd..3a10aa10 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -19,6 +19,7 @@ import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.activity.result.ActivityResultLauncher import androidx.annotation.IdRes import androidx.annotation.MainThread @@ -132,7 +133,6 @@ import com.lagradost.cloudstream3.utils.DataStore.setKey import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper.migrateResumeWatching import com.lagradost.cloudstream3.utils.Event -import com.lagradost.cloudstream3.utils.IOnBackPressed import com.lagradost.cloudstream3.utils.InAppUpdater.Companion.runAutoUpdate import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.UIHelper.changeStatusBarState @@ -650,34 +650,6 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { builder.show().setDefaultFocus() } - private fun backPressed() { - this.window?.navigationBarColor = - this.colorFromAttribute(R.attr.primaryGrayBackground) - this.updateLocale() - this.updateLocale() - - val navHostFragment = - supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment - val navController = navHostFragment?.navController - val isAtHome = - navController?.currentDestination?.matchDestination(R.id.navigation_home) == true - - if (isAtHome && isTvSettings()) { - showConfirmExitDialog() - } else { - super.onBackPressed() - } - } - - override fun onBackPressed() { - ((supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as? NavHostFragment?)?.childFragmentManager?.primaryNavigationFragment as? IOnBackPressed)?.onBackPressed() - ?.let { runNormal -> - if (runNormal) backPressed() - } ?: run { - backPressed() - } - } - override fun onDestroy() { val broadcastIntent = Intent() broadcastIntent.action = "restart_service" @@ -1087,6 +1059,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } catch (_: Throwable) { } } + override fun onCreate(savedInstanceState: Bundle?) { app.initClient(this) val settingsManager = PreferenceManager.getDefaultSharedPreferences(this) @@ -1384,6 +1357,12 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { this.putString(SearchFragment.SEARCH_QUERY, nextSearchQuery) } } + + if (isTvSettings()) { + if (navDestination.matchDestination(R.id.navigation_home)) { + attachBackPressedCallback() + } else detachBackPressedCallback() + } } //val navController = findNavController(R.id.nav_host_fragment) @@ -1598,6 +1577,44 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { // } // } + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + window?.navigationBarColor = colorFromAttribute(R.attr.primaryGrayBackground) + updateLocale() + + // If we don't disable we end up in a loop with default behavior calling + // this callback as well, so we disable it, run default behavior, + // then re-enable this callback so it can be used for next back press. + isEnabled = false + onBackPressedDispatcher.onBackPressed() + isEnabled = true + } + } + ) + } + + private var backPressedCallback: OnBackPressedCallback? = null + + private fun attachBackPressedCallback() { + if (backPressedCallback == null) { + backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + showConfirmExitDialog() + window?.navigationBarColor = + colorFromAttribute(R.attr.primaryGrayBackground) + updateLocale() + } + } + } + + backPressedCallback?.isEnabled = true + onBackPressedDispatcher.addCallback(this, backPressedCallback ?: return) + } + + private fun detachBackPressedCallback() { + backPressedCallback?.isEnabled = false } suspend fun checkGithubConnectivity(): Boolean { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadChildFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadChildFragment.kt index f62482ed..c3ec2bbd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadChildFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/download/DownloadChildFragment.kt @@ -60,7 +60,7 @@ class DownloadChildFragment : Fragment() { } }.sortedBy { it.data.episode + (it.data.season ?: 0) * 100000 } if (eps.isEmpty()) { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() return@main } @@ -78,7 +78,7 @@ class DownloadChildFragment : Fragment() { val folder = arguments?.getString("folder") val name = arguments?.getString("name") if (folder == null) { - activity?.onBackPressed() // TODO FIX + activity?.onBackPressedDispatcher?.onBackPressed() // TODO FIX return } fixPaddingStatusbar(binding?.downloadChildRoot) @@ -87,7 +87,7 @@ class DownloadChildFragment : Fragment() { title = name setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) setNavigationOnClickListener { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadedPlayerActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadedPlayerActivity.kt index 4c3376bb..1e2ea540 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadedPlayerActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadedPlayerActivity.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Bundle import android.util.Log import android.view.KeyEvent +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import com.lagradost.cloudstream3.CommonActivity import com.lagradost.cloudstream3.R @@ -34,10 +35,6 @@ class DownloadedPlayerActivity : AppCompatActivity() { CommonActivity.onUserLeaveHint(this) } - override fun onBackPressed() { - finish() - } - private fun playLink(url: String) { this.navigate( R.id.global_to_navigation_player, GeneratorPlayer.newInstance( @@ -109,6 +106,15 @@ class DownloadedPlayerActivity : AppCompatActivity() { finish() return } + + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + finish() + } + } + ) } override fun onResume() { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt index c30e70e5..ef3db0b4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultTrailerPlayer.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.activity.OnBackPressedCallback import androidx.core.view.isGone import androidx.core.view.isVisible import com.lagradost.cloudstream3.CommonActivity.screenHeight @@ -15,10 +16,8 @@ import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.ui.player.CSPlayerEvent import com.lagradost.cloudstream3.ui.player.PlayerEventSource import com.lagradost.cloudstream3.ui.player.SubtitleData -import com.lagradost.cloudstream3.utils.IOnBackPressed - -open class ResultTrailerPlayer : ResultFragmentPhone(), IOnBackPressed { +open class ResultTrailerPlayer : ResultFragmentPhone() { override var lockRotation = false override var isFullScreenPlayer = false @@ -28,7 +27,7 @@ open class ResultTrailerPlayer : ResultFragmentPhone(), IOnBackPressed { const val TAG = "RESULT_TRAILER" } - var playerWidthHeight: Pair? = null + private var playerWidthHeight: Pair? = null override fun nextEpisode() {} @@ -154,6 +153,10 @@ open class ResultTrailerPlayer : ResultFragmentPhone(), IOnBackPressed { } fixPlayerSize() uiReset() + + if (isFullScreenPlayer) { + attachBackPressedCallback() + } else detachBackPressedCallback() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -172,12 +175,26 @@ open class ResultTrailerPlayer : ResultFragmentPhone(), IOnBackPressed { } } - override fun onBackPressed(): Boolean { - return if (isFullScreenPlayer) { - updateFullscreen(false) - false - } else { - true + private var backPressedCallback: OnBackPressedCallback? = null + + private fun attachBackPressedCallback() { + if (backPressedCallback == null) { + backPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + updateFullscreen(false) + } + } } + + backPressedCallback?.isEnabled = true + + activity?.onBackPressedDispatcher?.addCallback( + activity ?: return, + backPressedCallback ?: return + ) + } + + private fun detachBackPressedCallback() { + backPressedCallback?.isEnabled = false } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index 6ea6363e..37c71134 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -82,7 +82,7 @@ class SettingsFragment : Fragment() { setTitle(title) setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) setNavigationOnClickListener { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() } } fixPaddingStatusbar(settingsToolbar) @@ -97,7 +97,7 @@ class SettingsFragment : Fragment() { setNavigationIcon(R.drawable.ic_baseline_arrow_back_24) children.firstOrNull { it is ImageView }?.tag = getString(R.string.tv_no_focus_tag) setNavigationOnClickListener { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() } } fixPaddingStatusbar(settingsToolbar) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt index b490386f..c5256ffa 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt @@ -70,7 +70,7 @@ class PluginsFragment : Fragment() { val isLocal = arguments?.getBoolean(PLUGINS_BUNDLE_LOCAL) == true if (url == null || name == null) { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() return } @@ -119,7 +119,7 @@ class PluginsFragment : Fragment() { if (searchView?.isIconified == false) { searchView.isIconified = true } else { - activity?.onBackPressed() + activity?.onBackPressedDispatcher?.onBackPressed() } } searchView?.setOnQueryTextFocusChangeListener { _, hasFocus -> diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/IOnBackPressed.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/IOnBackPressed.kt deleted file mode 100644 index b4922945..00000000 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/IOnBackPressed.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.lagradost.cloudstream3.utils - -interface IOnBackPressed { - fun onBackPressed(): Boolean -} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt index 231a634d..134d7127 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt @@ -418,7 +418,7 @@ object UIHelper { } fun FragmentActivity.popCurrentPage() { - this.onBackPressed() + this.onBackPressedDispatcher.onBackPressed() /*val currentFragment = supportFragmentManager.fragments.lastOrNull { it.isVisible } ?: return @@ -438,7 +438,7 @@ object UIHelper { val currentFragment = supportFragmentManager.fragments.lastOrNull { it.isVisible } - ?: //this.onBackPressed() + ?: //this.onBackPressedDispatcher.onBackPressed() return /* diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 00000000..ae9ece33 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 2b60e3a893416b2663e536b17ece81e12351bc11 Mon Sep 17 00:00:00 2001 From: self-similarity <137652432+self-similarity@users.noreply.github.com> Date: Fri, 10 Nov 2023 23:49:37 +0000 Subject: [PATCH 13/20] Fix faulty automatic subtitle selection (#760) --- .../java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 8d1eb7df..03b89a68 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1254,7 +1254,7 @@ class CS3IPlayer : IPlayer { .setMimeType(sub.mimeType) .setLanguage("_${sub.name}") .setId(sub.getId()) - .setSelectionFlags(SELECTION_FLAG_DEFAULT) + .setSelectionFlags(0) .build() when (sub.origin) { SubtitleOrigin.DOWNLOADED_FILE -> { From 6db295a799e0dfcc65f34c5b191a57d7f86cf016 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 11 Nov 2023 09:30:36 -0700 Subject: [PATCH 14/20] Upgrade gradle (#726) --- .idea/gradle.xml | 1 + app/build.gradle.kts | 16 ++++++++-------- build.gradle.kts | 9 ++++----- gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a8a2961a..c5c0ff3b 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -8,6 +8,7 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/who_is_watching.xml b/app/src/main/res/layout/who_is_watching.xml deleted file mode 100644 index f61cf6e4..00000000 --- a/app/src/main/res/layout/who_is_watching.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b349aecc..631201b1 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -20,4 +20,6 @@ 50dp 1dp + + 100dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9e0575da..ce660a67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,6 +65,7 @@ filter_sub_lang_key pref_filter_search_quality_key enable_nsfw_on_providers_key + skip_startup_account_select_key enable_skip_op_from_database %d %s | %s @@ -720,10 +721,16 @@ Enter PIN + Enter PIN for %s Enter Current PIN Lock Profile PIN Incorrect PIN. Please try again. PIN must be 4 characters Select an Account + Manage Accounts + Edit account + Logged in as %s + Skip account selection at startup + Use Default Account diff --git a/app/src/main/res/xml/settings_account.xml b/app/src/main/res/xml/settings_account.xml index d3dbcb31..ec882088 100644 --- a/app/src/main/res/xml/settings_account.xml +++ b/app/src/main/res/xml/settings_account.xml @@ -1,6 +1,12 @@ + + From e11d36aed8b7452392259b8801537dd6cd91f332 Mon Sep 17 00:00:00 2001 From: self-similarity <137652432+self-similarity@users.noreply.github.com> Date: Sun, 12 Nov 2023 15:36:21 +0000 Subject: [PATCH 18/20] Save selected subtitle language (#765) --- .../cloudstream3/ui/player/CS3IPlayer.kt | 3 +- .../ui/player/DownloadFileGenerator.kt | 3 +- .../cloudstream3/ui/player/GeneratorPlayer.kt | 43 +++++++++++++++---- .../ui/player/PlayerSubtitleHelper.kt | 7 ++- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index 03b89a68..74ea71e7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -1014,7 +1014,8 @@ class CS3IPlayer : IPlayer { format.id!!, SubtitleOrigin.EMBEDDED_IN_VIDEO, format.sampleMimeType ?: MimeTypes.APPLICATION_SUBRIP, - emptyMap() + emptyMap(), + format.language ) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadFileGenerator.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadFileGenerator.kt index b0223bb5..5585924e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadFileGenerator.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/DownloadFileGenerator.kt @@ -100,7 +100,8 @@ class DownloadFileGenerator( uri.toString(), SubtitleOrigin.DOWNLOADED_FILE, name.toSubtitleMimeType(), - emptyMap() + emptyMap(), + null ) ) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index 7c8d975a..43e51e55 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -23,6 +23,7 @@ import androidx.media3.common.Format.NO_VALUE import androidx.media3.common.MimeTypes import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull +import com.lagradost.cloudstream3.AcraApplication.Companion.setKey import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.databinding.DialogOnlineSubtitlesBinding import com.lagradost.cloudstream3.databinding.FragmentPlayerBinding @@ -38,6 +39,7 @@ import com.lagradost.cloudstream3.ui.player.source_priority.QualityDataHelper import com.lagradost.cloudstream3.ui.player.source_priority.QualityProfileDialog import com.lagradost.cloudstream3.ui.result.* import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings +import com.lagradost.cloudstream3.ui.subtitles.SUBTITLE_AUTO_SELECT_KEY import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getAutoSelectLanguageISO639_1 import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.Coroutines.ioSafe @@ -100,10 +102,33 @@ class GeneratorPlayer : FullScreenPlayer() { binding?.playerLoadingOverlay?.isVisible = true } - private fun setSubtitles(sub: SubtitleData?): Boolean { - currentSelectedSubtitles = sub - //Log.i(TAG, "setSubtitles = $sub") - return player.setPreferredSubtitles(sub) + private fun setSubtitles(subtitle: SubtitleData?): Boolean { + // If subtitle is changed -> Save the language + if (subtitle != currentSelectedSubtitles) { + val subtitleLanguage639 = if (subtitle == null) { + // "" is No Subtitles + "" + } else if (subtitle.languageCode != null) { + // Could be "English 4" which is why it is trimmed. + val trimmedLanguage = subtitle.languageCode.replace(Regex("\\d"), "").trim() + + languages.firstOrNull { language -> + language.languageName.equals(trimmedLanguage, ignoreCase = true) || + language.ISO_639_1 == subtitle.languageCode + }?.ISO_639_1 + } else { + null + } + + if (subtitleLanguage639 != null) { + setKey(SUBTITLE_AUTO_SELECT_KEY, subtitleLanguage639) + preferredAutoSelectSubtitles = subtitleLanguage639 + } + } + + currentSelectedSubtitles = subtitle + //Log.i(TAG, "setSubtitles = $subtitle") + return player.setPreferredSubtitles(subtitle) } override fun embeddedSubtitlesFetched(subtitles: List) { @@ -448,7 +473,8 @@ class GeneratorPlayer : FullScreenPlayer() { url = url, origin = SubtitleOrigin.URL, mimeType = url.toSubtitleMimeType(), - headers = currentSubtitle.headers + headers = currentSubtitle.headers, + currentSubtitle.lang ) runOnMainThread { addAndSelectSubtitles(subtitle) @@ -536,7 +562,8 @@ class GeneratorPlayer : FullScreenPlayer() { uri.toString(), SubtitleOrigin.DOWNLOADED_FILE, name.toSubtitleMimeType(), - emptyMap() + emptyMap(), + null ) addAndSelectSubtitles(subtitleData) @@ -946,7 +973,7 @@ class GeneratorPlayer : FullScreenPlayer() { var maxEpisodeSet: Int? = null var hasRequestedStamps: Boolean = false - override fun playerPositionChanged(position: Long, duration : Long) { + override fun playerPositionChanged(position: Long, duration: Long) { // Don't save livestream data if ((currentMeta as? ResultEpisode)?.tvType?.isLiveStream() == true) return @@ -1209,7 +1236,7 @@ class GeneratorPlayer : FullScreenPlayer() { } } - override fun playerDimensionsLoaded(width: Int, height : Int) { + override fun playerDimensionsLoaded(width: Int, height: Int) { setPlayerDimen(width to height) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt index e532d1a3..25d7e3dd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt @@ -30,13 +30,15 @@ enum class SubtitleOrigin { * @param name To be displayed in the player * @param url Url for the subtitle, when EMBEDDED_IN_VIDEO this variable is used as the real backend id * @param headers if empty it will use the base onlineDataSource headers else only the specified headers + * @param languageCode Not guaranteed to follow any standard. Could be something like "English 4" or "en". * */ data class SubtitleData( val name: String, val url: String, val origin: SubtitleOrigin, val mimeType: String, - val headers: Map + val headers: Map, + val languageCode: String? ) { /** Internal ID for exoplayer, unique for each link*/ fun getId(): String { @@ -80,7 +82,8 @@ class PlayerSubtitleHelper { url = subtitleFile.url, origin = SubtitleOrigin.URL, mimeType = subtitleFile.url.toSubtitleMimeType(), - headers = emptyMap() + headers = emptyMap(), + languageCode = subtitleFile.lang ) } } From 765071ebefe7a79b9c51638516bf0b39e7517c31 Mon Sep 17 00:00:00 2001 From: CranberrySoup <142951702+CranberrySoup@users.noreply.github.com> Date: Wed, 15 Nov 2023 16:30:29 +0000 Subject: [PATCH 19/20] Fixed flag and name for Levantine Arabic and Najdi Arabic (#770) --- .../com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt | 4 ++-- .../java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt index 224ca74a..5a751096 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt @@ -55,10 +55,10 @@ fun getCurrentLocale(context: Context): String { // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes leave blank for auto val appLanguages = arrayListOf( /* begin language list */ - Triple("", "ajp", "ajp"), + Triple("", "عربي شامي", "ajp"), Triple("", "አማርኛ", "am"), Triple("", "العربية", "ar"), - Triple("", "ars", "ars"), + Triple("", "اللهجة النجدية", "ars"), Triple("", "български", "bg"), Triple("", "বাংলা", "bn"), Triple("\uD83C\uDDE7\uD83C\uDDF7", "português brasileiro", "bp"), diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt index 33f1b6ff..09f5e0f1 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SubtitleHelper.kt @@ -153,9 +153,11 @@ object SubtitleHelper { private val flags = mapOf( "af" to "ZA", "agq" to "CM", + "ajp" to "SY", "ak" to "GH", "am" to "ET", "ar" to "AE", + "ars" to "SA", "as" to "IN", "asa" to "TZ", "az" to "AZ", @@ -515,4 +517,4 @@ object SubtitleHelper { Language639("Zhuang", "Saɯ cueŋƅ, Saw cuengh", "za", "zha", "zha", "zha", ""), Language639("Zulu", "isiZulu", "zu", "zul", "zul", "zul", ""), ) -} \ No newline at end of file +} From a2085202ec1753070f41f6b017c9a152334db319 Mon Sep 17 00:00:00 2001 From: IndusAryan <125901294+IndusAryan@users.noreply.github.com> Date: Wed, 15 Nov 2023 22:01:02 +0530 Subject: [PATCH 20/20] refactor: remove kapt and it's annotation processor, clean gradle, upgrade build-dir deprecation (#764) * remove kapt and its annotation processor * cleanup * change deprecated builddir --- app/build.gradle.kts | 174 +++++++++++++++++-------------------------- build.gradle.kts | 4 +- 2 files changed, 71 insertions(+), 107 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 540d8584..8e1798d8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,7 +8,6 @@ plugins { id("com.android.application") id("com.google.devtools.ksp") id("kotlin-android") - id("kotlin-kapt") id("org.jetbrains.dokka") } @@ -34,12 +33,12 @@ android { enable = true } - // disable this for now - //externalNativeBuild { - // cmake { - // path("CMakeLists.txt") - // } - //} + /* disable this for now + externalNativeBuild { + cmake { + path("CMakeLists.txt") + } + }*/ signingConfigs { create("prerelease") { @@ -58,10 +57,8 @@ android { defaultConfig { applicationId = "com.lagradost.cloudstream3" minSdk = 21 - - // https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading - targetSdk = 33 // android 14 is fucked - + targetSdk = 33 /* Android 14 is Fu*ked + ^ https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading*/ versionCode = 62 versionName = "4.2.1" @@ -93,10 +90,6 @@ android { arg("room.schemaLocation", "$projectDir/schemas") arg("exportSchema", "true") } - - kapt { - includeCompileClasspath = true - } } buildTypes { @@ -118,6 +111,7 @@ android { ) } } + flavorDimensions.add("state") productFlavors { create("stable") { @@ -137,14 +131,15 @@ android { compileOptions { isCoreLibraryDesugaringEnabled = true - sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } + lint { abortOnError = false checkReleaseBuilds = false } + namespace = "com.lagradost.cloudstream3" } @@ -153,125 +148,93 @@ repositories { } dependencies { - implementation("com.google.android.mediahome:video:1.0.0") - implementation("androidx.test.ext:junit-ktx:1.1.5") + // Testing + testImplementation("junit:junit:4.13.2") testImplementation("org.json:json:20230618") + androidTestImplementation("androidx.test:core") + implementation("androidx.test.ext:junit-ktx:1.1.5") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + // Android Core & Lifecycle implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.appcompat:appcompat:1.6.1") - - implementation("com.google.android.material:material:1.10.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - - implementation("androidx.navigation:navigation-fragment-ktx:2.7.5") implementation("androidx.navigation:navigation-ui-ktx:2.7.5") implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2") implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") + implementation("androidx.navigation:navigation-fragment-ktx:2.7.5") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation("androidx.test:core") - - // implementation("io.karn:khttp-android:0.1.2") //okhttp instead - // implementation("org.jsoup:jsoup:1.13.1") - // DONT UPDATE, WILL CRASH ANDROID TV ???? - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1") - - implementation("androidx.preference:preference-ktx:1.2.1") - - implementation("com.github.bumptech.glide:glide:4.15.1") - ksp("com.github.bumptech.glide:ksp:4.15.1") - implementation("com.github.bumptech.glide:okhttp3-integration:4.15.1") - // for ksp - ksp("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") - implementation("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") - implementation("com.google.guava:guava:32.1.2-android") - + // Design & UI implementation("jp.wasabeef:glide-transformations:4.3.0") - + implementation("androidx.preference:preference-ktx:1.2.1") + implementation("com.google.android.material:material:1.10.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") - // implementation("androidx.leanback:leanback-paging:1.1.0-alpha09") + // Glide Module + ksp("com.github.bumptech.glide:ksp:4.15.1") + implementation("com.github.bumptech.glide:glide:4.15.1") + implementation("com.github.bumptech.glide:okhttp3-integration:4.15.1") - // Media 3 - implementation("androidx.media3:media3-common:1.1.1") - implementation("androidx.media3:media3-exoplayer:1.1.1") - implementation("androidx.media3:media3-datasource-okhttp:1.1.1") + // For KSP -> Official Annotation Processors are Not Yet Supported for KSP + ksp("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") + implementation("com.google.guava:guava:32.1.2-android") + implementation("dev.zacsweers.autoservice:auto-service-ksp:1.1.0") + + // Media 3 (ExoPlayer) implementation("androidx.media3:media3-ui:1.1.1") - implementation("androidx.media3:media3-session:1.1.1") implementation("androidx.media3:media3-cast:1.1.1") + implementation("androidx.media3:media3-common:1.1.1") + implementation("androidx.media3:media3-session:1.1.1") + implementation("androidx.media3:media3-exoplayer:1.1.1") + implementation("com.google.android.mediahome:video:1.0.0") implementation("androidx.media3:media3-exoplayer-hls:1.1.1") implementation("androidx.media3:media3-exoplayer-dash:1.1.1") - // Custom ffmpeg extension for audio codecs - implementation("com.github.recloudstream:media-ffmpeg:1.1.0") + implementation("androidx.media3:media3-datasource-okhttp:1.1.1") - // Bug reports + // PlayBack + implementation("com.jaredrummler:colorpicker:1.1.0") // Subtitle Color Picker + implementation("com.github.recloudstream:media-ffmpeg:1.1.0") // Custom FF-MPEG Lib for Audio Codecs + implementation("com.github.teamnewpipe:NewPipeExtractor:eac850") /* For Trailers + ^ Update to Latest Commits if Trailers Misbehave, github.com/TeamNewPipe/NewPipeExtractor/commits/dev */ + implementation("com.github.albfernandez:juniversalchardet:2.4.0") // Subtitle Decoding + + // Crash Reports (AcraApplication.kt) implementation("ch.acra:acra-core:5.11.2") implementation("ch.acra:acra-toast:5.11.2") - //or for kotlin sources (requires kapt gradle plugin): - kapt("com.google.auto.service:auto-service:1.1.1") + // UI Stuff + implementation("com.facebook.shimmer:shimmer:0.5.0") // Shimmering Effect (Loading Skeleton) + implementation("androidx.palette:palette-ktx:1.0.0") // Palette For Images -> Colors + implementation("androidx.tvprovider:tvprovider:1.0.0") + implementation("com.github.discord:OverlappingPanels:0.1.5") // Gestures + implementation("com.github.rubensousa:previewseekbar-media3:1.1.1.0") // SeekBar Preview - // subtitle color picker - implementation("com.jaredrummler:colorpicker:1.1.0") + // Extensionns & Other Libs + implementation("org.mozilla:rhino:1.7.13") /* run JS + ^ Don't Bump RhinoJS to 1.7.14, since in 1.7.14 Rhino Uses the `SourceVersion` Class, Which is NOT + Available on Android (even with Desugaring) & `NoClassDefFoundError` Occurs. */ + implementation("me.xdrop:fuzzywuzzy:1.4.0") // Library/Ext Searching with Levenshtein Distance + implementation("com.github.LagradOst:SafeFile:0.0.5") // To Prevent the URI File Fu*kery + implementation("org.conscrypt:conscrypt-android:2.5.2") // To Fix SSL Fu*kery on Android 9 + implementation("com.uwetrottmann.tmdb2:tmdb-java:2.10.0") // TMDB API v3 Wrapper Made with RetroFit + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.6") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1") /* JSON Parser + ^ Don't Bump Jackson above 2.13.1 , Crashes on Android TV's and FireSticks that have Min API + Level 25 or Less. */ - // run JS - // do not upgrade to 1.7.14, since in 1.7.14 Rhino uses the `SourceVersion` class, which is not - // available on Android (even when using desugaring), and `NoClassDefFoundError` is thrown - implementation("org.mozilla:rhino:1.7.13") - - // TorrentStream - // implementation("com.github.TorrentStream:TorrentStream-Android:2.7.0") - - // Downloading + // Downloading & Networking implementation("androidx.work:work-runtime:2.8.1") implementation("androidx.work:work-runtime-ktx:2.8.1") - - // Networking - // implementation("com.squareup.okhttp3:okhttp:4.9.2") - // implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.1") - implementation("com.github.Blatzar:NiceHttp:0.4.4") // http library - // To fix SSL fuckery on android 9 - implementation("org.conscrypt:conscrypt-android:2.5.2") - // Util to skip the URI file fuckery 🙏 - implementation("com.github.LagradOst:SafeFile:0.0.5") - - // API because cba maintaining it myself - implementation("com.uwetrottmann.tmdb2:tmdb-java:2.10.0") - - implementation("com.github.discord:OverlappingPanels:0.1.5") - // debugImplementation because LeakCanary should only run in debug builds. - // debugImplementation("com.squareup.leakcanary:leakcanary-android:2.12") - - // for shimmer when loading - implementation("com.facebook.shimmer:shimmer:0.5.0") - - implementation("androidx.tvprovider:tvprovider:1.0.0") - - // used for subtitle decoding https://github.com/albfernandez/juniversalchardet - implementation("com.github.albfernandez:juniversalchardet:2.4.0") - - // newpipe yt taken from https://github.com/TeamNewPipe/NewPipeExtractor/commits/dev - // this should be updated frequently to avoid trailer fu*kery - implementation("com.github.teamnewpipe:NewPipeExtractor:917554a") - coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.6") - - // Library/extensions searching with Levenshtein distance - implementation("me.xdrop:fuzzywuzzy:1.4.0") - - // color palette for images -> colors - implementation("androidx.palette:palette-ktx:1.0.0") - // seekbar https://github.com/rubensousa/PreviewSeekBar - implementation("com.github.rubensousa:previewseekbar-media3:1.1.1.0") + implementation("com.github.Blatzar:NiceHttp:0.4.4") // HTTP Lib } tasks.register("androidSourcesJar", Jar::class) { archiveClassifier.set("sources") - from(android.sourceSets.getByName("main").java.srcDirs) //full sources + from(android.sourceSets.getByName("main").java.srcDirs) // Full Sources } -// this is used by the gradlew plugin +// For GradLew Plugin tasks.register("makeJar", Copy::class) { from("build/intermediates/compile_app_classes_jar/prereleaseDebug") into("build") @@ -295,6 +258,7 @@ tasks.withType().configureEach { // URL showing where the source code can be accessed through the web browser remoteUrl.set(URL("https://github.com/recloudstream/cloudstream/tree/master/app/src/main/java")) + // Suffix which is used to append the line number to the URL. Use #L for GitHub remoteLineSuffix.set("#L") } diff --git a/build.gradle.kts b/build.gradle.kts index 16cfb68f..13c25281 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,6 @@ plugins { id("com.google.devtools.ksp") version "1.9.20-1.0.14" apply false } -tasks.register("clean", Delete::class) { - delete(rootProject.buildDir) +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) } \ No newline at end of file