diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml
new file mode 100644
index 00000000..371f2e29
--- /dev/null
+++ b/.idea/appInsightsSettings.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 00000000..0c0c3383
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 00000000..b268ef36
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 00000000..fdf8d994
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 00000000..f8051a6f
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 73f70a2d..a6204b83 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -10,13 +10,14 @@ plugins {
id("dagger.hilt.android.plugin")
id("kotlin-kapt")
id("com.google.protobuf") version "0.9.0"
+ kotlin("plugin.serialization") version "1.9.0"
}
apply(plugin = "dagger.hilt.android.plugin")
val versionMajor = 0
val versionMinor = 1
-val versionPatch = 5
+val versionPatch = 6
val versionBuild = 0
val isStable = true
@@ -173,18 +174,19 @@ ksp {
dependencies {
// Kotlin
- implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
+ implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1")
+ implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
// AndroidX
- coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")
- implementation("androidx.core:core-ktx:1.10.1")
+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
+ implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.palette:palette-ktx:1.0.0")
- implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.appcompat:appcompat:1.7.0-alpha03")
// Compose
- implementation("androidx.navigation:navigation-compose:2.7.0")
- implementation("androidx.activity:activity-compose:1.7.2")
+ implementation("androidx.navigation:navigation-compose:2.7.6")
+ implementation("androidx.activity:activity-compose:1.8.2")
implementation("androidx.compose.material:material:$compose_version")
implementation("androidx.compose.material3:material3:$compose_m3_version")
implementation("androidx.compose.material:material-icons-extended:$compose_version")
@@ -203,15 +205,15 @@ dependencies {
implementation("io.github.fornewid:material-motion-compose-navigation:1.0.6")
// Images
- implementation("io.coil-kt:coil-compose:2.4.0")
+ implementation("io.coil-kt:coil-compose:2.2.2")
// DI
- implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
+ implementation("androidx.hilt:hilt-navigation-compose:1.1.0")
implementation("com.google.dagger:hilt-android:$hilt_version")
ksp("com.google.dagger:hilt-compiler:$hilt_version")
// Playback
- implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.7.1")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.7.3")
implementation("com.gitlab.mvysny.slf4j:slf4j-handroid:1.7.30")
implementation("androidx.media2:media2-session:$media2_version")
implementation("androidx.media2:media2-player:$media2_version")
@@ -236,8 +238,8 @@ dependencies {
// Data - Proto
implementation("androidx.datastore:datastore:1.0.0")
- implementation("com.google.protobuf:protobuf-java:3.23.2")
- implementation("com.tencent:mmkv:1.2.15")
+ implementation("com.google.protobuf:protobuf-java:3.25.1")
+ implementation("com.tencent:mmkv:1.3.2")
}
//https://stackoverflow.com/questions/65390807/unresolved-reference-protoc-when-using-gradle-protocol-buffers
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index f0b13da3..d42e5110 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -1,6 +1,6 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.kts.
+# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
@@ -48,40 +48,12 @@
# genericjson gson fixes
-keep,allowobfuscation class * extends xyz.gianlu.librespot.json.JsonWrapper { *; }
-# Keep `Companion` object fields of serializable classes.
-# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
--if @kotlinx.serialization.Serializable class **
--keepclassmembers class <1> {
- static <1>$Companion Companion;
-}
-
-# Keep `serializer()` on companion objects (both default and named) of serializable classes.
--if @kotlinx.serialization.Serializable class ** {
- static **$* *;
-}
--keepclassmembers class <2>$<3> {
- kotlinx.serialization.KSerializer serializer(...);
-}
-
-# Keep `INSTANCE.serializer()` of serializable objects.
--if @kotlinx.serialization.Serializable class ** {
- public static ** INSTANCE;
-}
--keepclassmembers class <1> {
- public static <1> INSTANCE;
- kotlinx.serialization.KSerializer serializer(...);
-}
-
-# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
--keepattributes RuntimeVisibleAnnotations,AnnotationDefault
-
# protobuf
-keep class com.spotify.** {*;}
-keep class spotify.** {*;}
-keep class bruhcollective.itaysonlab.swedentricks.** {*;}
-keep class bruhcollective.itaysonlab.jetispot.proto.** {*;}
-keep class com.google.protobuf.Any {*;}
--keep class com.google.protobuf.GeneratedMessageV3 {*;}
-keep class * extends com.google.protobuf.AbstractMessage {*;}
# librespot
@@ -111,6 +83,7 @@
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* ;
}
+-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn javax.annotation.**
-dontwarn kotlin.Unit
-dontwarn retrofit2.KotlinExtensions
@@ -120,5 +93,63 @@
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation
--dontwarn kotlinx.serialization.KSerializer
--dontwarn kotlinx.serialization.Serializable
\ No newline at end of file
+
+# KotlinX Serialization
+# Keep `Companion` object fields of serializable classes.
+# This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects.
+-if @kotlinx.serialization.Serializable class **
+-keepclassmembers class <1> {
+ static <1>$Companion Companion;
+}
+
+# Keep `serializer()` on companion objects (both default and named) of serializable classes.
+-if @kotlinx.serialization.Serializable class ** {
+ static **$* *;
+}
+-keepclassmembers class <2>$<3> {
+ kotlinx.serialization.KSerializer serializer(...);
+}
+
+# Keep `INSTANCE.serializer()` of serializable objects.
+-if @kotlinx.serialization.Serializable class ** {
+ public static ** INSTANCE;
+}
+-keepclassmembers class <1> {
+ public static <1> INSTANCE;
+ kotlinx.serialization.KSerializer serializer(...);
+}
+
+# @Serializable and @Polymorphic are used at runtime for polymorphic serialization.
+-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
+
+# Don't print notes about potential mistakes or omissions in the configuration for kotlinx-serialization classes
+# See also https://github.com/Kotlin/kotlinx.serialization/issues/1900
+-dontnote kotlinx.serialization.**
+
+#
+-dontwarn javax.sound.sampled.AudioFormat$Encoding
+-dontwarn javax.sound.sampled.AudioFormat
+-dontwarn javax.sound.sampled.AudioSystem
+-dontwarn javax.sound.sampled.Control$Type
+-dontwarn javax.sound.sampled.Control
+-dontwarn javax.sound.sampled.DataLine$Info
+-dontwarn javax.sound.sampled.FloatControl$Type
+-dontwarn javax.sound.sampled.FloatControl
+-dontwarn javax.sound.sampled.Line$Info
+-dontwarn javax.sound.sampled.Line
+-dontwarn javax.sound.sampled.LineUnavailableException
+-dontwarn javax.sound.sampled.Mixer$Info
+-dontwarn javax.sound.sampled.Mixer
+-dontwarn javax.sound.sampled.SourceDataLine
+-dontwarn org.apache.logging.log4j.Level
+-dontwarn org.apache.logging.log4j.core.config.Configurator
+-dontwarn org.bouncycastle.jsse.BCSSLParameters
+-dontwarn org.bouncycastle.jsse.BCSSLSocket
+-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
+-dontwarn org.conscrypt.Conscrypt$Version
+-dontwarn org.conscrypt.Conscrypt
+-dontwarn org.conscrypt.ConscryptHostnameVerifier
+-dontwarn org.openjsse.javax.net.ssl.SSLParameters
+-dontwarn org.openjsse.javax.net.ssl.SSLSocket
+-dontwarn org.openjsse.net.ssl.OpenJSSE
+-dontwarn kotlinx.serialization.internal.ClassValueReferences
\ No newline at end of file
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/core/SpAuthManager.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/core/SpAuthManager.kt
index 274bf5bc..b5191052 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/core/SpAuthManager.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/core/SpAuthManager.kt
@@ -44,11 +44,6 @@ class SpAuthManager @Inject constructor(
}.onFailure { th ->
Log.i("SpAuthManager", "auth stored failure", th)
AuthResult.Exception(Exception(th))
- try {
- reset()
- } catch (e: Exception) {
- Log.i("SpAuthManager", "auth stored failure: reset failed")
- }
}
}
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/AppNavigation.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/AppNavigation.kt
index fe24799d..4e4d59d8 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/AppNavigation.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/AppNavigation.kt
@@ -57,12 +57,10 @@ fun AppNavigation(
) {
val slideDistance = rememberSlideDistance()
- LaunchedEffect(true) {
- val isLogged = sessionManager.isSignedIn()
- Log.d("Test", "isLogged: $isLogged")
- if (isLogged) return@LaunchedEffect
+ LaunchedEffect(Unit) {
+ if (sessionManager.isSignedIn()) return@LaunchedEffect
authManager.authStored()
- navController.navigate(if (isLogged) Screen.Feed.route else Screen.Authorization.route) {
+ navController.navigate(if (sessionManager.isSignedIn()) Screen.Feed.route else Screen.Authorization.route) {
popUpTo(Screen.NavGraph.route)
}
}
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/ext/ModifierExt.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/ext/ModifierExt.kt
index fd52e070..a1bfc2e0 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/ext/ModifierExt.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/ext/ModifierExt.kt
@@ -1,19 +1,101 @@
package bruhcollective.itaysonlab.jetispot.ui.ext
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.graphics.BlendMode
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.unit.Dp
+
fun Modifier.disableTouch(disabled: Boolean = true) =
if (disabled) {
pointerInput(Unit) {
awaitPointerEventScope {
while (true) {
- awaitPointerEvent(pass = PointerEventPass.Initial).changes.forEach(PointerInputChange::consume)
+ awaitPointerEvent(pass = PointerEventPass.Initial).changes.forEach(
+ PointerInputChange::consume
+ )
}
}
}
} else {
- Modifier
- }
\ No newline at end of file
+ this
+ }
+
+fun Modifier.fadingEdge(
+ left: Dp? = null,
+ top: Dp? = null,
+ right: Dp? = null,
+ bottom: Dp? = null,
+) = this
+ .graphicsLayer(alpha = 0.99f)
+ .drawWithContent {
+ drawContent()
+ if (top != null) {
+ drawRect(
+ brush = Brush.verticalGradient(
+ colors = listOf(
+ Color.Transparent,
+ Color.Black
+ ),
+ startY = 0f,
+ endY = top.toPx()
+ ),
+ blendMode = BlendMode.DstIn
+ )
+ }
+ if (bottom != null) {
+ drawRect(
+ brush = Brush.verticalGradient(
+ colors = listOf(
+ Color.Black,
+ Color.Transparent
+ ),
+ startY = size.height - bottom.toPx(),
+ endY = size.height
+ ),
+ blendMode = BlendMode.DstIn
+ )
+ }
+ if (left != null) {
+ drawRect(
+ brush = Brush.horizontalGradient(
+ colors = listOf(
+ Color.Black,
+ Color.Transparent
+ ),
+ startX = 0f,
+ endX = left.toPx()
+ ),
+ blendMode = BlendMode.DstIn
+ )
+ }
+ if (right != null) {
+ drawRect(
+ brush = Brush.horizontalGradient(
+ colors = listOf(
+ Color.Transparent,
+ Color.Black
+ ),
+ startX = size.width - right.toPx(),
+ endX = size.width
+ ),
+ blendMode = BlendMode.DstIn
+ )
+ }
+ }
+
+fun Modifier.fadingEdge(
+ horizontal: Dp? = null,
+ vertical: Dp? = null,
+) = fadingEdge(
+ left = horizontal,
+ right = horizontal,
+ top = vertical,
+ bottom = vertical
+)
\ No newline at end of file
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/NowPlayingViewModel.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/NowPlayingViewModel.kt
index afd21ceb..1f6c5153 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/NowPlayingViewModel.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/NowPlayingViewModel.kt
@@ -12,11 +12,9 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.IntSize
import androidx.lifecycle.ViewModel
import bruhcollective.itaysonlab.jetispot.R
-import bruhcollective.itaysonlab.jetispot.SpApp
import bruhcollective.itaysonlab.jetispot.core.SpPlayerServiceManager
import bruhcollective.itaysonlab.jetispot.core.api.SpPartnersApi
import bruhcollective.itaysonlab.jetispot.core.lyrics.SpLyricsController
-import bruhcollective.itaysonlab.jetispot.core.util.Log
import bruhcollective.itaysonlab.jetispot.core.util.SpUtils
import bruhcollective.itaysonlab.jetispot.ui.ext.blendWith
import bruhcollective.itaysonlab.jetispot.ui.navigation.NavigationController
@@ -25,7 +23,6 @@ import com.spotify.metadata.Metadata
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.*
import xyz.gianlu.librespot.common.Utils
-import xyz.gianlu.librespot.metadata.ArtistId
import javax.inject.Inject
@HiltViewModel
@@ -127,6 +124,23 @@ class NowPlayingViewModel @Inject constructor(
}
}
+ private fun lyricLineIndexToTime(index: Int): Long {
+ return spLyricsController.currentLyricsLines[index].startTimeMs
+ }
+
+ private fun lyricLineTimeToIndex(time: Long): Long {
+ val index = spLyricsController.currentLyricsLines.indexOfLast { it.startTimeMs < time }
+ return spLyricsController.currentLyricsLines[index].startTimeMs
+ }
+
+ fun seekToLyricLineByIndex(index: Int) {
+ seekTo(lyricLineIndexToTime(index))
+ }
+
+ fun seekToLyricsLineByTime(time: Long) {
+ seekTo(lyricLineTimeToIndex(time))
+ }
+
suspend fun calculateDominantColor(
partnersApi: SpPartnersApi,
url: String,
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingBackground.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingBackground.kt
index d3e324b9..ce71799d 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingBackground.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingBackground.kt
@@ -24,7 +24,9 @@ fun NowPlayingBackground(
modifier: Modifier
) {
val currentColor = viewModel.currentBgColor.value
- val dominantColorAsBg = animateColorAsState(if (currentColor == Color.Transparent) MaterialTheme.colorScheme.surface else currentColor)
+ val dominantColorAsBg = animateColorAsState(if (currentColor == Color.Transparent) MaterialTheme.colorScheme.surface else currentColor,
+ label = ""
+ )
val isSystemInDarkTheme = isSystemInDarkTheme()
Canvas(modifier) {
drawRect(
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingFullscreenComposition.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingFullscreenComposition.kt
index b14801ec..c67bd74f 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingFullscreenComposition.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingFullscreenComposition.kt
@@ -137,7 +137,8 @@ fun NowPlayingFullscreenComposition(
.fillMaxSize()
.alpha(1f - queueProgressValue),
rvStateProgress = lyricsProgressValue,
- selectedLyricIndex = viewModel.spLyricsController.currentSongLineIndex
+ selectedLyricIndex = viewModel.spLyricsController.currentSongLineIndex,
+ backgroundColor = viewModel.currentBgColor.value
)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingLyricsComposition.kt b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingLyricsComposition.kt
index db82c443..1f63f236 100644
--- a/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingLyricsComposition.kt
+++ b/app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/fullscreen/NowPlayingLyricsComposition.kt
@@ -1,16 +1,25 @@
package bruhcollective.itaysonlab.jetispot.ui.screens.nowplaying.fullscreen
+import android.util.Log
+import androidx.compose.animation.core.CubicBezierEasing
+import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.core.animateIntAsState
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.scaleIn
+import androidx.compose.animation.slideInVertically
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -24,6 +33,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import bruhcollective.itaysonlab.jetispot.ui.ext.fadingEdge
import bruhcollective.itaysonlab.jetispot.ui.screens.nowplaying.NowPlayingViewModel
@Composable
@@ -31,10 +41,10 @@ fun NowPlayingLyricsComposition(
modifier: Modifier,
viewModel: NowPlayingViewModel,
rvStateProgress: Float,
- selectedLyricIndex: Int
+ selectedLyricIndex: Int,
+ backgroundColor: Color
) {
Box(modifier) {
- val color = oppositeColorOfSystem(alpha = 0.2f)
Canvas(modifier = Modifier.fillMaxSize()) {
val offset = Offset(
x = lerp(viewModel.lyricsCardParams.first.x, 0f, rvStateProgress),
@@ -57,7 +67,7 @@ fun NowPlayingLyricsComposition(
val radius = androidx.compose.ui.unit.lerp(12.dp, 0.dp, rvStateProgress).toPx()
drawRoundRect(
- color = color,
+ color = backgroundColor.copy(alpha = 0.2f),
topLeft = offset,
size = size,
cornerRadius = CornerRadius(radius, radius)
@@ -71,19 +81,23 @@ fun NowPlayingLyricsComposition(
.fillMaxSize()
.statusBarsPadding()
.padding(top = 56.dp)
+ .fadingEdge(vertical = 24.dp)
.offset {
IntOffset(x = 0, y = (48.dp.toPx() * (1f - rvStateProgress)).toInt())
}) {
LazyColumn(
contentPadding = PaddingValues(horizontal = 16.dp),
- verticalArrangement = Arrangement.spacedBy(8.dp)
+ verticalArrangement = Arrangement.spacedBy(4.dp)
) {
itemsIndexed(viewModel.spLyricsController.currentLyricsLines) { index, line ->
LyricLine(
text = line.words,
selected = index == selectedLyricIndex
- )
+ ) {
+ Log.i("NowPlayingLyricsComposition", "onClick: $index")
+ viewModel.seekToLyricLineByIndex(index)
+ }
}
}
}
@@ -94,17 +108,33 @@ fun NowPlayingLyricsComposition(
@Composable
private fun LyricLine(
text: String,
- selected: Boolean
+ selected: Boolean,
+ onClick: () -> Unit = {}
) {
- val alpha by animateFloatAsState(targetValue = if (selected) 1f else 0.7f, label = "Lyrics line text alpha")
+ val alpha by animateFloatAsState(
+ targetValue = if (selected) 1f else 0.6f,
+ label = "Lyrics line text alpha"
+ )
- Text(
- text = text,
- color = Color.White,
- fontSize = 21.sp,
- fontWeight = FontWeight.SemiBold,
- modifier = Modifier.alpha(alpha)
+ val animatedFontSize by animateIntAsState(
+ targetValue = if (selected) 32 else 20,
+ label = "Lyrics line text font size",
+ animationSpec = tween(500, easing = CubicBezierEasing(0.4f, 0f, 0.2f, 1f))
)
+
+ Surface(
+ modifier = Modifier.fillMaxWidth(),
+ color = Color.Transparent,
+ onClick = onClick,
+ ) {
+ Text(
+ text = text,
+ color = Color.White,
+ fontSize = animatedFontSize.sp,
+ fontWeight = FontWeight.SemiBold,
+ modifier = Modifier.alpha(alpha)
+ )
+ }
}
private fun lerp(a: Float, b: Float, to: Float): Float {
diff --git a/build.gradle.kts b/build.gradle.kts
index bc46e238..d926a48d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,25 +1,26 @@
buildscript {
- val version_code by extra(15)
- val version_name by extra("poc_v15")
+ val version_code by extra(16)
+ val version_name by extra("poc_v16")
val compose_version by extra("1.5.0")
- val compose_m3_version by extra("1.1.1")
+ val compose_m3_version by extra("1.1.2")
val compose_compiler_version by extra("1.5.1")
val media2_version by extra("1.2.1")
val accompanist_version by extra("0.33.0-alpha")
- val room_version by extra("2.5.2")
+ val room_version by extra("2.6.1")
- val librespot_commit by extra("efe5b3398e")
- val hilt_version by extra("2.47")
+ val librespot_commit by extra("6244f91aeb")
+ val hilt_version by extra("2.49")
}
plugins {
- id("com.android.application") version "8.1.0" apply false
- id("com.android.library") version "8.1.0" apply false
+ id("com.android.application") version "8.1.4" apply false
+ id("com.android.library") version "8.1.4" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
- id("com.google.dagger.hilt.android") version "2.47" apply false
+ id("com.google.dagger.hilt.android") version "2.49" apply false
id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
+ kotlin("plugin.serialization") version "1.9.0" apply false
}
tasks.register("clean", Delete::class) {