fix(stations): обложки Record только для Record-станций + своя плитка остальным
- сети, отличные от Radio Record (DFM, HitFM и др.), больше не получают обложки Radio Record (обогащение Record API гейтится по source=record) - станции без обложки рисуют свою фирменную плитку: цвет по названию + инициалы (вместо общего значка/чужой обложки)
This commit is contained in:
@@ -15,6 +15,8 @@ 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.graphics.Brush
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
@@ -66,12 +68,21 @@ fun StationCard(
|
||||
contentScale = ContentScale.Crop
|
||||
)
|
||||
} else {
|
||||
Icon(
|
||||
Lucide.Radio,
|
||||
contentDescription = null,
|
||||
tint = colors.textMuted,
|
||||
modifier = Modifier.align(Alignment.Center).size(34.dp)
|
||||
)
|
||||
// Своя фирменная плитка станции (цвет из названия + инициалы),
|
||||
// а не общий значок и не чужая обложка.
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.background(stationTileBrush(station.name)),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text(
|
||||
text = stationInitials(station.name),
|
||||
color = androidx.compose.ui.graphics.Color.White,
|
||||
fontWeight = FontWeight.Black,
|
||||
style = androidx.compose.material3.MaterialTheme.typography.headlineMedium
|
||||
)
|
||||
}
|
||||
}
|
||||
Box(
|
||||
modifier = Modifier
|
||||
@@ -114,3 +125,22 @@ fun StationCard(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Инициалы станции для плитки-плейсхолдера (1–2 символа). */
|
||||
private fun stationInitials(name: String): String {
|
||||
val words = name.trim().split(Regex("\\s+")).filter { it.isNotBlank() }
|
||||
return when {
|
||||
words.isEmpty() -> "?"
|
||||
words.size == 1 -> words[0].take(2).uppercase()
|
||||
else -> (words[0].take(1) + words[1].take(1)).uppercase()
|
||||
}
|
||||
}
|
||||
|
||||
/** Детерминированный фирменный градиент плитки по названию станции. */
|
||||
private fun stationTileBrush(name: String): Brush {
|
||||
val h = (name.hashCode().toLong() and 0xFFFFFFFFL)
|
||||
val hue = (h % 360L).toFloat()
|
||||
val c1 = Color.hsv(hue, 0.55f, 0.45f)
|
||||
val c2 = Color.hsv((hue + 28f) % 360f, 0.6f, 0.30f)
|
||||
return Brush.linearGradient(listOf(c1, c2))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user