🚀 Release 3.0.5
Versión centrada en mejoras de interfaz Material 3 Expressive, haptic feedback, drag & drop para proveedores de letras, optimizaciones de reproductor con zoom immersivo y experiencia de usuario avanzada.
✨ Nuevas Funciones
🎛️ Sistema de Haptic Feedback Completo
Se introduce un nuevo sistema de feedback háptico con compatibilidad automática entre versiones de Android.
Características:
HapticManagercon 10+ tipos de vibración- Fallbacks automáticos para Android 5.0+
- Control global mediante
EnableHapticFeedbackKey - Compatibilidad: Click, Toggle, Confirm, Reject, Keyboard, DragStart, GestureEnd
- Integración en MiniPlayer y componentes interactivos
📱 Top App Bar Flexible Material 3
Nueva navegación expresiva con LargeFlexibleTopAppBar en pantallas de configuración.
Beneficios:
- Diseño moderno y responsivo
- Animaciones suaves al desplazar
- Mejor aprovechamiento de espacio
- Consistencia en toda la app
🎵 Reordenamiento Drag & Drop para Proveedores de Letras
Nuevo diálogo para reorganizar el orden de búsqueda de proveedores de letras.
Componente: DragDropLyricsProviderDialog
- Soporte para LrcLib, Kugou, BetterLyrics, SimpMusic
- Persistencia automática en DataStore
- Animations suaves con Spring
- Hit-testing mejorado para evitar saltos
🎨 LanguageSelector Bottom Sheet Expresivo
Nueva interfaz Material 3 para seleccionar idiomas con búsqueda integrada.
Características:
LanguageSelectorBottomSheetreutilizable- Sistema de default "System Default"
- Búsqueda en tiempo real
- Animaciones de selección
- Soporte para Android 13+
🎬 Mejoras de Canvas y Reproductor
🖼️ Custom Canvas Provider - Lógica de Matching Mejorada
Se refactoriza completamente el algoritmo de coincidencia del CustomCanvasProvider para manejar mejor casos con metadatos faltantes.
Cambios Principales:
-
Flujo de Matching Optimizado:
- Prioriza coincidencias por artista primero
- Seguidas de filtros específicos por álbum o canción
- Fallback mejorado: cuando el álbum no está disponible, intenta matching por título de canción
- Si falla, utiliza entradas de artista disponibles como último recurso
-
Helper
createArtwork:- Estandariza la creación de objetos
CanvasArtwork - Reduce código duplicado
- Estandariza la creación de objetos
-
Debug Logging Mejorado:
- Clarifica tipos de coincidencia: "song (without album)", "exact song", "album (without specific song)"
- Facilita troubleshooting en desarrollo
🎥 CanvasArtworkPlayer - Zoom Immersivo
Actualización de ResizeMode:
- Cambio:
RESIZE_MODE_FIT→RESIZE_MODE_ZOOM - Beneficio: Experiencia visual más moderna y edge-to-edge
- Comportamiento: Mantiene aspect ratio mientras llena toda la pantalla
Integración Consistente:
PlayerComponents.ktyThumbnail.ktahora usanRESIZE_MODE_ZOOMen todas partes- Reemplaza
RESIZE_MODE_FILLyRESIZE_MODE_FIT - Proporciona visual coherente en diferentes vistas del reproductor
Canvas Multi-Proveedor Mejorado
Cambios:
- Nuevo
CanvasArtworkResolvermás robusto - Soporte para splits de artistas (colabs, feat.)
- Fix: búsqueda individual por artista secundario
- Mejor manejo de casos edge
Reproductor V8 Avanzado
Novedades:
- Integración de Canvas en
V8PlayerBackdrop - Fullscreen opcional mediante
PlayerFullscreenKey - Motion Scheme expresivo
- Mejor sincronización de Insets
🔧 Mejoras Internas
Material 3 Expressive Masivo
CircularWavyProgressIndicatoren lugar deCircularProgressIndicatorLargeFlexibleTopAppBaren configuraciónToggleButtonconButtonGroupDefaults- Animaciones con
spring()y damping ratios ButtonGroupDefaults.connectedShapes()para botones unidos
Refactor de Componentes
Dialog.kt:
- Parámetro
confirmButtonpersonalizable - Mejor separación de responsabilidades
PlayerMenu.kt:
- Nuevo
SleepTimerDialogexpresivo - Visualización mejorada de tiempos
Player Components Cleanup:
- Eliminado whitespace redundante
- Limpieza de imports no utilizados
- Mejor mantenibilidad del código
Nuevas Preferencias
val EnableHapticFeedbackKey = booleanPreferencesKey("enableHapticFeedback")
val PlayerFullscreenKey = booleanPreferencesKey("player_fullscreen")
val ProviderOrderKey = stringPreferencesKey("lyrics_provider_order")
val CustomCanvasEnabledKey = booleanPreferencesKey("custom_canvas_enabled")
val CustomCanvasApiUrlKey = stringPreferencesKey("custom_canvas_api_url")