- RecordingPlaybackController: ExoPlayer создаётся лениво (на первый play) и освобождается в stop() — раньше второй плеер висел в памяти всю сессию у каждого. Поллер позиции 500мс крутится только во время игры (был вечный 2 Гц main-loop). - StationRepositoryImpl.refreshStations: merge каталога O(n) через apiById/apiByName индексы вместо .find на каждую станцию (было O(n²) ~700×700 на холодном старте). Убраны verbose Log.d-трейсы (оставлен Log.e/.w на ошибки). - Track/Station/StreamQuality помечены @Immutable — read-only модели, иначе списки tags/qualities делали класс нестабильным → лишние рекомпозиции списков. - HttpLoggingInterceptor только при BuildConfig.DEBUG (включён buildConfig feature): в релизе нет оверхеда на каждый запрос и утечки URL в logcat.
40 lines
1.5 KiB
Kotlin
40 lines
1.5 KiB
Kotlin
package com.radiola.domain.model
|
|
|
|
import androidx.compose.runtime.Immutable
|
|
|
|
// @Immutable: модели read-only (заполняются один раз из БД/маппера и не мутируются).
|
|
// Список tags/qualities иначе делает класс «нестабильным» для Compose → лишние
|
|
// рекомпозиции списков станций. Помечаем явно — компилятор сможет пропускать.
|
|
@Immutable
|
|
data class Station(
|
|
val id: Int,
|
|
val name: String,
|
|
val prefix: String,
|
|
val streamUrl: String,
|
|
val coverUrl: String,
|
|
val genre: String,
|
|
val tags: List<String>,
|
|
val sortOrder: Int,
|
|
val source: String = "record",
|
|
// Доступные качества потока (битрейты). Пусто или один элемент — переключателя нет.
|
|
val qualities: List<StreamQuality> = emptyList()
|
|
)
|
|
|
|
/** Один вариант качества потока станции. */
|
|
@Immutable
|
|
data class StreamQuality(
|
|
val bitrate: Int, // kbps
|
|
val url: String,
|
|
val type: String // "aac" | "mp3"
|
|
) {
|
|
/** Человекочитаемая ступень качества по битрейту. */
|
|
val tierLabel: String
|
|
get() = when {
|
|
bitrate >= 256 -> "Максимальное"
|
|
bitrate >= 128 -> "Высокое"
|
|
bitrate >= 96 -> "Среднее"
|
|
bitrate >= 64 -> "Экономно"
|
|
else -> "Минимальное"
|
|
}
|
|
}
|