fix(ui): отступы под системную навигацию + подписи сервисов + краш навбара

- навбар и мини-плеер: navigationBarsPadding — не налезают на системные кнопки
- плеер: navigationBarsPadding снизу, ряд сервисов не уходит под системную панель
- подписи сервисов без обрезки слов (Яндекс / ВК Музыка / YT Music и т.д.)
- фикс NPE при холодном старте: навбар обращается к NavDestinations напрямую,
  не к companion-списку (порядок инициализации Kotlin)
This commit is contained in:
nk
2026-06-02 22:13:10 +03:00
parent af13272852
commit cefd0be009
3 changed files with 27 additions and 4 deletions

View File

@@ -78,7 +78,7 @@ class MainActivity : ComponentActivity() {
Scaffold( Scaffold(
bottomBar = { bottomBar = {
if (showChrome) { if (showChrome) {
Column { Column(Modifier.navigationBarsPadding()) {
if (currentStation != null) { if (currentStation != null) {
MiniPlayer( MiniPlayer(
stationName = currentStation!!.name, stationName = currentStation!!.name,

View File

@@ -37,7 +37,15 @@ import com.radiola.ui.theme.RadiolaTheme
fun BottomNavBar(navController: NavController) { fun BottomNavBar(navController: NavController) {
val colors = RadiolaTheme.colors val colors = RadiolaTheme.colors
val currentRoute = navController.currentBackStackEntryAsState().value?.destination?.route val currentRoute = navController.currentBackStackEntryAsState().value?.destination?.route
val items = NavDestinations.items.filter { it.showInBottomBar } // Обращаемся к объектам напрямую: companion-список NavDestinations.items
// при холодном старте может содержать null (порядок инициализации Kotlin).
val items = listOf(
NavDestinations.Stations,
NavDestinations.Favorites,
NavDestinations.History,
NavDestinations.Recordings,
NavDestinations.Settings
)
Row( Row(
modifier = Modifier modifier = Modifier

View File

@@ -8,6 +8,7 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -69,6 +70,7 @@ fun PlayerBottomSheet(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.background(colors.bgBase) .background(colors.bgBase)
.navigationBarsPadding()
.padding(horizontal = 24.dp, vertical = 20.dp), .padding(horizontal = 24.dp, vertical = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
@@ -262,7 +264,20 @@ private fun PlayerIconBtn(
} }
} }
/** Монохромная кнопка сервиса для поиска трека (без официальных логотипов). */ /** Короткая подпись сервиса под кнопкой (без обрезки слов). */
private fun serviceShortName(service: DeeplinkService): String = when (service.serviceId) {
"yandex" -> "Яндекс"
"vk" -> "ВК Музыка"
"boom" -> "BOOM"
"spotify" -> "Spotify"
"apple" -> "Apple Music"
"youtube" -> "YT Music"
"tidal" -> "Tidal"
"deezer" -> "Deezer"
else -> service.displayName
}
/** Монохромная кнопка сервиса для поиска трека. */
@Composable @Composable
private fun ServiceDeeplinkBtn( private fun ServiceDeeplinkBtn(
service: DeeplinkService, service: DeeplinkService,
@@ -302,7 +317,7 @@ private fun ServiceDeeplinkBtn(
} }
} }
Text( Text(
text = service.displayName.take(8), text = serviceShortName(service),
style = MaterialTheme.typography.labelSmall, style = MaterialTheme.typography.labelSmall,
color = colors.textSecondary, color = colors.textSecondary,
maxLines = 1, maxLines = 1,