Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ dependencies {
implementation(libs.media3)
implementation(libs.media3.session)
implementation(libs.media3.okhttp)
implementation("androidx.media3:media3-ui:1.8.0")
implementation(libs.media3.ui)
implementation(libs.squigglyslider)

// Google Cast & local streaming proxy
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.darkxvenom.airbeats.ui.component

import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.spring
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
Expand All @@ -26,6 +29,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.draw.scale
import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
Expand Down Expand Up @@ -70,8 +75,27 @@ fun BoxScope.HomeFloatingActions(
)
.then(modifier)
) {
val fabRotation by animateFloatAsState(
targetValue = if (expanded) 90f else 0f,
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = 500f,
),
label = "homeFabRotation",
)
val fabScale by animateFloatAsState(
targetValue = if (expanded) 0.94f else 1f,
animationSpec = spring(
dampingRatio = Spring.DampingRatioNoBouncy,
stiffness = 500f,
),
label = "homeFabScale",
)

FloatingActionButton(
modifier = Modifier.padding(16.dp),
modifier = Modifier
.padding(16.dp)
.scale(fabScale),
onClick = {
haptic.performHapticFeedback(HapticFeedbackType.TextHandleMove)
expanded = true
Expand All @@ -81,7 +105,8 @@ fun BoxScope.HomeFloatingActions(
) {
Icon(
painter = painterResource(R.drawable.more_vert),
contentDescription = "Options"
contentDescription = "Options",
modifier = Modifier.rotate(fabRotation),
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.darkxvenom.airbeats.ui.component

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.core.Spring
Expand Down Expand Up @@ -34,6 +35,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.scale
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
Expand Down Expand Up @@ -126,6 +128,11 @@ private fun MaterialNavItem(
animationSpec = materialNavSpring(),
label = "navItemContent",
)
val iconScale by animateFloatAsState(
targetValue = if (selected) 1.06f else 1f,
animationSpec = materialNavSpring(),
label = "navItemIconScale",
)

Surface(
onClick = onClick,
Expand All @@ -146,7 +153,9 @@ private fun MaterialNavItem(
painter = painterResource(id = iconRes),
contentDescription = label,
tint = contentColor,
modifier = Modifier.size(26.dp),
modifier = Modifier
.size(26.dp)
.scale(iconScale),
)
AnimatedVisibility(
visible = selected && label.isNotEmpty(),
Expand Down
19 changes: 12 additions & 7 deletions app/src/main/java/com/darkxvenom/airbeats/ui/player/MiniPlayer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ import androidx.compose.ui.graphics.rememberGraphicsLayer
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
Expand Down Expand Up @@ -187,7 +187,15 @@ fun MiniPlayer(
else -> MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.95f)
}

val currentView = LocalView.current
val context = LocalContext.current
val thumbnailRequest = remember(mediaMetadata?.thumbnailUrl) {
mediaMetadata?.thumbnailUrl?.highQualityThumbnail()?.let { thumbnailUrl ->
ImageRequest.Builder(context)
.data(thumbnailUrl)
.crossfade(true)
.build()
}
}
val layoutDirection = LocalLayoutDirection.current
val coroutineScope = rememberCoroutineScope()

Expand Down Expand Up @@ -382,12 +390,9 @@ fun MiniPlayer(
}
}
) {
mediaMetadata?.let { metadata ->
thumbnailRequest?.let { request ->
AsyncImage(
model = ImageRequest.Builder(LocalView.current.context)
.data(metadata.thumbnailUrl?.highQualityThumbnail())
.crossfade(true)
.build(),
model = request,
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier
Expand Down
3 changes: 2 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ kotlin = "2.3.10"
compose = "1.9.4"
lifecycle = "2.9.4"
material3 = "1.5.0-alpha18"
media3 = "1.8.0"
media3 = "1.11.1"
room = "2.7.2"
hilt = "2.58"
ktor = "3.0.3"
Expand Down Expand Up @@ -76,6 +76,7 @@ palette = { group = "androidx.palette", name = "palette", version = "1.0.0" }
media3 = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" }
media3-okhttp = { group = "androidx.media3", name = "media3-datasource-okhttp", version.ref = "media3" }
media3-session = { group = "androidx.media3", name = "media3-session", version.ref = "media3" }
media3-ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3" }

room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
Expand Down
Loading