nk
ba32973beb
feat(lyrics): тексты песен внутри приложения через LRCLIB
...
- LrcLibApi (api/get + api/search, User-Agent), DI @Named(lrclib) Retrofit
- LyricsRepository.fetchLyrics -> LyricsResult (plain/synced/instrumental)
- LyricsViewModel + LyricsSheet (загрузка/инструментал/найдено/не найдено),
прокрутка + атрибуция LRCLIB
- кнопка «Текст песни» открывает встроенный экран (плеер + деталь трека чартов),
вместо ссылки в браузере
2026-06-03 11:47:00 +03:00
nk
5fd97d27fd
fix(stations): обложки Record только для Record-станций + своя плитка остальным
...
- сети, отличные от Radio Record (DFM, HitFM и др.), больше не получают
обложки Radio Record (обогащение Record API гейтится по source=record)
- станции без обложки рисуют свою фирменную плитку: цвет по названию + инициалы
(вместо общего значка/чужой обложки)
2026-06-03 11:36:24 +03:00
nk
32e5108d98
fix(stations): подтягивать обложки/потоки Record по названию станции
...
Локальные станции (assets/stations.json, id 1,2,3...) обогащались данными
Record только по id, но id Record-каталога другие (15016...) и prefix в
ассетах нет — поэтому совпадений почти не было и обложки не грузились.
Добавлен фолбэк-матч по названию станции (стабильный общий ключ).
2026-06-03 11:22:57 +03:00
nk
a50a108f63
fix(ui): иконочный таб-бар, заголовок станций, ровные кнопки плеера, рабочая ссылка на текст
...
- таб-бар только иконки (6 разделов не помещались с подписями)
- «Откройте радио» -> «Выберите радиостанцию»
- кнопки плеера (лайк/prev/next/запись) единого размера 24/48, ряд SpaceBetween
(кнопка записи больше не обрезается и не выбивается размером)
- текст песни: Musixmatch резал соединение -> веб-поиск трека (открывается)
2026-06-03 11:15:29 +03:00
nk
fc9b23f62c
fix(player): now-playing с нашего бэкенда вместо сырого Record-эндпоинта
...
Record /stations/now использует id now-слотов, не совпадающие с id каталога,
поэтому клиент не находил трек по station.id (трек/обложка не показывались).
Теперь берём GET /now-playing с нашего бэка (корректный маппинг recordSync,
ключ = id станции) -> плеер показывает название трека и обложку.
2026-06-03 10:59:59 +03:00
nk
eca0c49ad4
fix(ui): тёмный сплэш с фирменной иконкой вместо белого экрана
...
- Theme.Radiola -> тёмная (windowBackground #0C1410), прозрачные системные бары
- Theme.Radiola.Splash (core-splashscreen): фон #0C1410 + иконка приложения
- installSplashScreen() в MainActivity; тема сплэша на launcher-активити
2026-06-03 00:27:29 +03:00
nk
e190444577
feat: фирменная иконка приложения + внутренний плеер записей
...
- адаптивная иконка лаунчера: градиентный фон (C2F25B->6FA53C) + монограмма R
(foreground + monochrome для тем Android 13), манифест -> @mipmap
- воспроизведение своих записей ВНУТРИ приложения вместо внешнего плеера:
RecordingPlaybackController (отдельный ExoPlayer, останавливает радио),
RecordingPlayerSheet с перемоткой (Slider), play/pause, +/-15с, таймеры
2026-06-03 00:13:12 +03:00
nk
d0e5f4e8c5
feat(charts): раздел «Чарты» (клиент) + детальная страница трека с графиком
...
- вкладка «Чарты» в навигации; экран: периоды (День/Неделя/Месяц/Всё),
ранжированный список треков (ранг, обложка, проигрывания, тренд)
- детальная карточка трека: метрики, график популярности (Canvas), лайк,
кнопки музыкальных сервисов, кнопка «Текст песни» (ссылка на лицензированный
Musixmatch — полный текст не встраиваем, авторское право)
- ChartsRepository/LyricsRepository + эндпоинты charts/* в RadiolaApi (DTO)
- превью-данные пока бэкенд не отдаёт charts (помечено TODO)
2026-06-02 23:24:42 +03:00
nk
a4af72a6e6
polish(ui): плавные обложки, бегущая строка длинных названий, тактильный отклик
...
- Coil crossfade для всех обложек (Images.crossfadeModel) — без «моргания» при загрузке
- basicMarquee для длинных названий трека (плеер и мини-плеер) вместо обрезки
- haptic feedback на play/pause и добавление в избранное (плеер, мини-плеер, карточка)
2026-06-02 22:55:18 +03:00
nk
310d6c3177
fix(player): отображение трека и обложки — объединение REST и socket now-playing
...
REST-поллинг (refreshNowPlaying -> api.getNowPlaying, 200 OK) писал данные в
_nowPlaying, который нигде не читался; getNowPlaying() брал только сокет (пустой).
Теперь getNowPlaying/getAllNowPlaying объединяют оба источника (socket ?: REST),
поэтому название трека, обложка и deep-link сервисов работают.
2026-06-02 22:55:18 +03:00
nk
cefd0be009
fix(ui): отступы под системную навигацию + подписи сервисов + краш навбара
...
- навбар и мини-плеер: navigationBarsPadding — не налезают на системные кнопки
- плеер: navigationBarsPadding снизу, ряд сервисов не уходит под системную панель
- подписи сервисов без обрезки слов (Яндекс / ВК Музыка / YT Music и т.д.)
- фикс NPE при холодном старте: навбар обращается к NavDestinations напрямую,
не к companion-списку (порядок инициализации Kotlin)
2026-06-02 22:55:17 +03:00
nk
af13272852
fix(ui): единый скролл на экране станций + всегда видимый навбар
...
- StationsScreen: закреплённые заголовок/поиск/жанры, одна прокручиваемая
сетка станций; поиск и фильтры больше не исчезают при пустом результате
(+ кнопка «Сбросить фильтры»)
- таб-бар показывается без обязательного входа (скрыт только на экране входа)
- старт сразу со «Станций» — авторизация необязательна, вход из Настроек
2026-06-02 22:55:17 +03:00
nk
220d1d6fa1
feat(ui): мягкие переходы между экранами (fade + лёгкий slide)
2026-06-02 22:55:17 +03:00
nk
f604ad42e8
feat(ui): рестайл всех экранов + плеер + официальные mono-логотипы сервисов
...
- экраны (Станции/Избранное/История/Записи/Настройки/Вход): двухцветные
заголовки, токены темы, EmptyState, анимации появления и перестановки
- AuthScreen: брендовый локап (AppMark + RadiolaWordmark)
- PlayerBottomSheet: живой эфир — LiveEqualizer вместо перемотки,
Crossfade трека и play/pause, pressScale, анимация избранного/записи
- кнопки музыкальных сервисов: монохромные официальные логотипы
(vector drawable из Simple Icons CC0 + Yandex), маппинг serviceLogoRes
- DeeplinkBottomSheet: сетка сервисов с логотипами
2026-06-02 22:55:17 +03:00
nk
d652dc399a
feat(ui): рестайл общих компонентов под дизайн-систему
...
- StationCard: обложка/иконка-заглушка, анимированное сердечко, pressScale
- MiniPlayer: elevated-бар, метка «СЕЙЧАС ИГРАЕТ», Crossfade play/pause
- SearchBar: surface-поле, акцентный курсор, скругление 14
- FilterChips: акцентный активный чип с анимацией цвета
- EmptyState: иконка-плашка + текст
- TrackListItem: thumb-заглушка, pressScale
2026-06-02 22:55:17 +03:00
nk
ae406554de
feat(ui): дизайн-система radiOLA — палитра, тема, типографика, бренд, motion, pill таб-бар
...
- цветовые токены тёмно-зелёной темы + RadiolaColors (CompositionLocal)
- darkColorScheme + всегда тёмная тема, фирменные shapes
- типографика с весами/размерами под макет
- Brand: AppMark (градиентный R), RadiolaWordmark, MonoMark
- Motion: спеки движения, pressScale, живой эквалайзер
- pill-таб-бар с анимированной активной вкладкой
2026-06-02 22:55:17 +03:00
nk
2f686bcc57
chore: add .gitignore and remove build artifacts from index
2026-06-02 22:50:00 +03:00
nk
bcb999ace9
feat: WebSocket now-playing via Socket.IO from backend
2026-06-02 19:52:15 +03:00
nk
a83672b455
feat: auth screen with auto-redirect, sync favorites/history with backend
2026-06-02 19:12:07 +03:00
nk
d4adb1e7be
fix: add launcher icons and update manifest references
2026-06-01 13:35:28 +03:00
nk
bc94577276
chore: add Gradle wrapper 8.7
2026-06-01 13:26:38 +03:00
nk
59f62a22b2
test: add unit tests for use cases and ViewModel, add Compose UI test
2026-06-01 13:23:11 +03:00
nk
af8fb333d9
feat(widget): add 4x1 AppWidgetProvider with play/pause and track info
2026-06-01 13:21:37 +03:00
nk
9ce9758361
feat(player): wire StationsScreen and FavoritesScreen to actual playback
2026-06-01 13:19:23 +03:00
nk
ada422053f
feat(deeplink): add DeeplinkNavigator, DeeplinkBottomSheet and integrate into History and Player
2026-06-01 13:15:31 +03:00
nk
aa287f7588
feat(ui): integrate MiniPlayer into Scaffold with real player state
2026-06-01 13:12:51 +03:00
nk
9e3ce0f1e4
feat(ui): wire all screens into NavHost with BottomSheet player
2026-06-01 13:07:11 +03:00
nk
15e15c6664
feat(ui): add SettingsScreen and SettingsViewModel
2026-06-01 13:06:08 +03:00
nk
d3cec3bba2
feat(ui): add HistoryScreen and HistoryViewModel
2026-06-01 13:04:35 +03:00
nk
b2af81c070
feat(ui): add FavoritesScreen and FavoritesViewModel
2026-06-01 13:03:24 +03:00
nk
ee91837910
feat(ui): add PlayerBottomSheet and PlayerViewModel
2026-06-01 13:02:16 +03:00
nk
1c902b5607
feat(ui): add StationsScreen and StationsViewModel
2026-06-01 13:00:12 +03:00
nk
116ab95abd
feat(ui): add shared components (StationCard, TrackListItem, SearchBar, FilterChips, MiniPlayer, EmptyState)
2026-06-01 12:58:25 +03:00
nk
28309c201e
chore: add Lucide icons dependency and replace Material Icons in navigation
2026-06-01 12:54:36 +03:00
nk
c46a865742
feat(ui): add bottom navigation with 4 tabs
2026-06-01 12:23:27 +03:00
nk
cf79af5273
feat(service): add ExoPlayer controller and MediaSessionService
2026-06-01 12:21:22 +03:00
nk
9d68459df6
feat(di): add Hilt AppModule with Retrofit, Room and repository bindings
2026-06-01 12:19:33 +03:00
nk
e255b0458d
feat(data): add repository implementations
2026-06-01 12:18:10 +03:00
nk
110fe0795e
feat(data): add Room entities, DAOs and AppDatabase
2026-06-01 12:12:55 +03:00
nk
62674fcc3f
feat(data): add Retrofit API, DTOs and mappers
2026-06-01 12:11:15 +03:00
nk
828cdf9a50
feat(domain): add core use cases
2026-06-01 12:08:49 +03:00
nk
aad1361043
feat(domain): add repository interfaces
2026-06-01 12:07:29 +03:00
nk
d345cd40b8
feat(domain): add Station, Track, PlayerState, DeeplinkService models
2026-06-01 12:05:13 +03:00
nk
7b1aa0c073
feat: add Application, MainActivity and Material3 theme
2026-06-01 12:02:35 +03:00
nk
8f26bf16d3
chore: add app module build config and manifest
2026-06-01 11:57:59 +03:00
nk
082e895f6a
chore: bootstrap root Gradle with version catalog
2026-06-01 11:54:39 +03:00
nk
4700335f11
Add radiOLA design spec
2026-06-01 11:14:38 +03:00