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) {