github Arturo254/OpenTune 3.0.2

one hour ago

🚀 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 visuales
  • AlwaysOnDisplaySettings.kt – Pantalla de configuración completa
  • fullscreen.xml – Icono vectorial para modo inmersivo

Archivos modificados:

  • PlayerMenu.kt – Nuevo entry point para AOD en el bottom sheet
  • NavigationBuilder.kt – Nuevo route always_on_display como Dialog fullscreen
  • AppearanceSettings.kt – Preferencias de estilo, forma, oscuridad y tamaño
  • PreferenceKeys.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ón getHighQualityThumbnail() y resize() mejorado
  • Thumbnail.kt – Integración del preloading de thumbnails de alta resolución
  • App.kt – Inicialización de ThumbnailCache al 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 CanvasArtworkPlayer para 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/artista
  • CanvasArtworkPlayer.kt – Reproductor de canvas extraído y modularizado
  • CanvasArtwork.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ático
  • Player.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.kt
  • Player.kt
  • PlayerMenu.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) – Para SquigglySlider
  • @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ñol
  • values-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_mode y descripción
  • aod_background_darkness y aod_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)

🔗 Full Changelog

Don't miss a new OpenTune release

NewReleases is sending notifications on new releases.