🚀 Release 3.0.2
Versión centrada en Always On Display (AOD) completo, caché de thumbnails y estabilidad del reproductor.
✨ Nuevas Funciones
📱 Always On Display (AOD) – Sistema completo
Se introduce una pantalla "Always On Display" que mantiene la pantalla encendida mientras el reproductor está activo, ideal para montar el dispositivo en el auto o usar como reloj musical.
Archivos nuevos:
AlwaysOnDisplayScreen.kt– Pantalla principal AOD con 5 estilos visualesAlwaysOnDisplaySettings.kt– Pantalla de configuración completafullscreen.xml– Icono vectorial para modo inmersivo
Archivos modificados:
PlayerMenu.kt– Nuevo entry point para AOD en el bottom sheetNavigationBuilder.kt– Nuevo routealways_on_displaycomo Dialog fullscreenAppearanceSettings.kt– Preferencias de estilo, forma, oscuridad y tamañoPreferenceKeys.kt– Nuevas keys:AodStyleKey,AodShapeKey,AodDarknessKey,AodArtworkSizeKey,AodFullscreenKey,AodAutoActivationKey
Características del AOD:
| Característica | Detalle |
|---|---|
| 5 estilos | CLASSIC (clásico), BACKGROUND (fondo con blur), MINIMAL (mínimo), LARGE (artwork grande), SPOTLIGHT (destacado)
|
| 8 formas de artwork | Rounded, Circle, Squircle, Diamond, Hexagon, Star, Arch, Petal (usando GenericShape)
|
| Efecto Cloudy | Blur + viñeta dual (exterior e interior) para fondos artísticos |
| Activación automática | Timer por inactividad: Never, 15s, 30s, 1m, 2m (integración con Player.kt)
|
| Modo inmersivo | Oculta status bar y navigation bar usando WindowInsetsControllerCompat
|
| Soporte landscape | Layouts separados para orientación horizontal en todos los estilos |
| Controles animados | MinimalAnimatedButton y AnimatedButton con feedback visual al presionar
|
| Marquee text | Título y artista con scroll automático si exceden ancho |
🖼️ Sistema de Thumbnails de alta calidad
Se implementa un sistema de caché dual (memoria + disco) para thumbnails de YouTube, mejorando drásticamente la experiencia visual.
Archivos modificados:
YouTubeUtils.kt– Nueva funcióngetHighQualityThumbnail()yresize()mejoradoThumbnail.kt– Integración del preloading de thumbnails de alta resoluciónApp.kt– Inicialización deThumbnailCacheal arrancar la app
Nuevo archivo:
ThumbnailCache.kt– Objeto con caché LruCache en memoria y caché persistente en disco (50MB límite)
Detalles técnicos:
- Soporte de calidades:
maxres(1080px),sd(640px),hq(480px),mq(320px),default(120px) - Redimensionamiento automático según resolución solicitada
- Limpieza automática del disco cuando se supera el límite
- Preloading en
CanvasArtworkPlayerpara animaciones fluidas
🎨 Canvas Artwork refactorizado
El sistema de Canvas Artwork se rediseña completamente para ser más modular, cacheable y eficiente.
Archivos nuevos:
CanvasArtworkResolver.kt– Lógica de resolución de artwork por título/artistaCanvasArtworkPlayer.kt– Reproductor de canvas extraído y modularizadoCanvasArtwork.kt– Data model para URLs estáticas, animadas o de video
Archivos modificados:
CanvasArtworkPlaybackCache.kt– Convertido a LRU cache con persistencia JSON y trimming automáticoPlayer.kt– Integración del nuevo sistema de canvas
Mejoras:
- Normalización inteligente de strings (eliminación de caracteres especiales, limpieza de feat., etc.)
- Persistencia en disco para no re-descargar artwork entre sesiones
- Soporte para artwork estático, GIF animado y video
🔧 Correcciones
| Archivo | Corrección |
|---|---|
UpdateScreen.kt
| URL de nightly builds actualizada de GitHub releases a Cloudflare R2 (pub-2218e6bbd5b948e1b5d882cf4d92086d.r2.dev)
|
Player.kt
| Queue sheet ahora tappable y visible cuando está colapsado |
PlayerMenu.kt
| Bottom sheet ahora soporta scrolling + layout unificado |
DiscordLoginScreen.kt
| setWebContentsDebuggingEnabled restringido solo a BuildConfig.DEBUG
|
AlwaysOnDisplayScreen.kt
| Supresión de lint ConfigurationScreenWidthHeight + mejor manejo de duración C.TIME_UNSET
|
makeTimeString (utils)
| Manejo correcto de C.TIME_UNSET y duraciones negativas
|
🧠 Refactor Interno
Validación de duración simplificada
Se reemplazan comprobaciones redundantes de C.TIME_UNSET por una lógica más limpia basada en duration > 0L.
Archivos afectados:
AlwaysOnDisplayScreen.ktPlayer.ktPlayerMenu.kt
Importaciones y código muerto
- Limpieza de imports no utilizados
- Eliminación de código comentado y boilerplate
- Estandarización de indentación en
NavigationBuilder.kt
Anotaciones experimentales
@OptIn(ExperimentalMaterial3Api::class)– ParaSquigglySlider@file:OptIn(ExperimentalMaterial3ExpressiveApi::class)– Para nuevas shapes M3
🎨 UI/UX Mejoras
| Componente | Mejora |
|---|---|
PlayerMenu.kt
| Card de volumen con mute/unmute toggle + slider sincronizado |
AlwaysOnDisplayScreen.kt
| Reemplazo de Slider estándar por SquigglySlider (expresivo)
|
Thumbnail.kt
| Icono por defecto cambiado a opentune_monochrome
|
🌍 Localización
Archivos modificados:
values/strings.xml– Strings en inglés para AOD (estilos, formas, tiempos, modo inmersivo)values-es/strings.xml– Traducción completa al españolvalues-hi/strings.xml– Traducción expandida al hindi (contribución @Gorupa)
Nuevos strings incluidos:
aod_style_*(5 estilos)aod_shape_*(8 formas)aod_auto_activation_*(Never, 15s, 30s, 1m, 2m)aod_immersive_modey descripciónaod_background_darknessyaod_artwork_size
⚙️ Dependencias
| Cambio | Detalle |
|---|---|
| Nueva dependencia | me.saket.squiggles:squiggles-slider – SquigglySlider expresivo
|
| Nota | No se actualizaron AGP, Kotlin, Compose, Media3, Ktor en esta versión |
🔢 Versión
- versionCode:
129(inferido de changelog 3.0.1 → 3.0.2) - versionName:
3.0.2
💡 Una release centrada en Always On Display premium, rendimiento visual con caché de thumbnails y estabilidad general del reproductor.
📦 Pull Requests (What's Changed)
| PR | Autor | Archivos afectados | Descripción |
|---|---|---|---|
| #548 | @Gorupa | values-hi/strings.xml
| Hindi strings expandido |
| #540 | @Gorupa | Player.kt
| Fix: queue sheet no era tappable ni visible cuando colapsado |
| #588 | @Aeshp | PlayerMenu.kt
| Fix: scrolling habilitado y layout unificado en bottom sheet |
| #597 | @jim-daf | DiscordLoginScreen.kt
| Gate setWebContentsDebuggingEnabled a BuildConfig.DEBUG
|
🎉 New Contributors
📂 Listado completo de archivos modificados
app/src/main/java/com/arturo254/opentune/
├── ui/screens/
│ ├── AlwaysOnDisplayScreen.kt (nuevo)
│ ├── AlwaysOnDisplaySettings.kt (nuevo)
│ ├── UpdateScreen.kt (modificado)
│ └── DiscordLoginScreen.kt (modificado)
├── ui/components/
│ ├── PlayerMenu.kt (modificado)
│ ├── Thumbnail.kt (modificado)
│ └── Player.kt (modificado)
├── ui/navigation/
│ └── NavigationBuilder.kt (modificado)
├── ui/settings/
│ ├── AppearanceSettings.kt (modificado)
│ └── PreferenceKeys.kt (modificado)
├── utils/
│ ├── YouTubeUtils.kt (modificado)
│ ├── ThumbnailCache.kt (nuevo)
│ └── makeTimeString (modificado)
├── canvas/
│ ├── CanvasArtworkResolver.kt (nuevo)
│ ├── CanvasArtworkPlayer.kt (nuevo)
│ ├── CanvasArtwork.kt (nuevo)
│ └── CanvasArtworkPlaybackCache.kt (refactorizado)
├── App.kt (modificado)
└── res/
├── drawable/fullscreen.xml (nuevo)
├── values/strings.xml (modificado)
├── values-es/strings.xml (modificado)
└── values-hi/strings.xml (modificado)