From ada422053f0e47a9be1cbb3842982db157e1a94e Mon Sep 17 00:00:00 2001 From: nk Date: Mon, 1 Jun 2026 13:15:31 +0300 Subject: [PATCH] feat(deeplink): add DeeplinkNavigator, DeeplinkBottomSheet and integrate into History and Player --- .../com/radiola/deeplink/DeeplinkNavigator.kt | 16 ++++++ .../ui/components/DeeplinkBottomSheet.kt | 50 +++++++++++++++++++ .../com/radiola/ui/history/HistoryScreen.kt | 12 ++++- .../radiola/ui/player/PlayerBottomSheet.kt | 6 +-- 4 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/radiola/deeplink/DeeplinkNavigator.kt create mode 100644 app/src/main/java/com/radiola/ui/components/DeeplinkBottomSheet.kt diff --git a/app/src/main/java/com/radiola/deeplink/DeeplinkNavigator.kt b/app/src/main/java/com/radiola/deeplink/DeeplinkNavigator.kt new file mode 100644 index 0000000..576007e --- /dev/null +++ b/app/src/main/java/com/radiola/deeplink/DeeplinkNavigator.kt @@ -0,0 +1,16 @@ +package com.radiola.deeplink + +import android.content.Context +import android.content.Intent +import android.net.Uri +import com.radiola.domain.model.DeeplinkService +import com.radiola.domain.model.Track + +object DeeplinkNavigator { + + fun openSearch(context: Context, track: Track, service: DeeplinkService) { + val url = service.buildSearchUrl(track.artist, track.song) + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + context.startActivity(Intent.createChooser(intent, "Открыть в...")) + } +} diff --git a/app/src/main/java/com/radiola/ui/components/DeeplinkBottomSheet.kt b/app/src/main/java/com/radiola/ui/components/DeeplinkBottomSheet.kt new file mode 100644 index 0000000..5784889 --- /dev/null +++ b/app/src/main/java/com/radiola/ui/components/DeeplinkBottomSheet.kt @@ -0,0 +1,50 @@ +package com.radiola.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.radiola.deeplink.DeeplinkNavigator +import com.radiola.domain.model.DeeplinkService +import com.radiola.domain.model.Track +import com.radiola.ui.player.PlayerViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DeeplinkBottomSheet( + track: Track, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + viewModel: PlayerViewModel = hiltViewModel() +) { + val context = androidx.compose.ui.platform.LocalContext.current + val enabledServices by viewModel.enabledServices.collectAsState() + + ModalBottomSheet( + onDismissRequest = onDismiss, + modifier = modifier + ) { + Text( + text = "Найти трек", + style = MaterialTheme.typography.headlineSmall, + modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp) + ) + LazyColumn { + items(enabledServices) { service -> + ListItem( + headlineContent = { Text(service.displayName) }, + modifier = Modifier.clickable { + DeeplinkNavigator.openSearch(context, track, service) + onDismiss() + } + ) + } + } + } +} diff --git a/app/src/main/java/com/radiola/ui/history/HistoryScreen.kt b/app/src/main/java/com/radiola/ui/history/HistoryScreen.kt index bf092c2..b65fb78 100644 --- a/app/src/main/java/com/radiola/ui/history/HistoryScreen.kt +++ b/app/src/main/java/com/radiola/ui/history/HistoryScreen.kt @@ -8,6 +8,8 @@ import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import com.radiola.domain.model.Track +import com.radiola.ui.components.DeeplinkBottomSheet import com.radiola.ui.components.EmptyState import com.radiola.ui.components.SearchBar import com.radiola.ui.components.TrackListItem @@ -20,6 +22,7 @@ fun HistoryScreen( ) { val history by viewModel.history.collectAsState() val searchQuery by viewModel.searchQuery.collectAsState() + var selectedTrack by remember { mutableStateOf(null) } Scaffold( topBar = { @@ -52,7 +55,7 @@ fun HistoryScreen( items(history) { track -> TrackListItem( track = track, - onClick = { /* TODO: open deeplink bottom sheet */ } + onClick = { selectedTrack = track } ) Divider(color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.05f)) } @@ -60,4 +63,11 @@ fun HistoryScreen( } } } + + if (selectedTrack != null) { + DeeplinkBottomSheet( + track = selectedTrack!!, + onDismiss = { selectedTrack = null } + ) + } } diff --git a/app/src/main/java/com/radiola/ui/player/PlayerBottomSheet.kt b/app/src/main/java/com/radiola/ui/player/PlayerBottomSheet.kt index 839bc8e..f1a3266 100644 --- a/app/src/main/java/com/radiola/ui/player/PlayerBottomSheet.kt +++ b/app/src/main/java/com/radiola/ui/player/PlayerBottomSheet.kt @@ -1,7 +1,5 @@ package com.radiola.ui.player -import android.content.Intent -import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -26,6 +24,7 @@ import com.composables.icons.lucide.Pause import com.composables.icons.lucide.Play import com.radiola.domain.model.DeeplinkService import com.radiola.domain.model.Station +import com.radiola.deeplink.DeeplinkNavigator import com.radiola.domain.model.Track @Composable @@ -97,8 +96,7 @@ fun PlayerBottomSheet( service = service, onClick = { track?.let { t -> - val url = viewModel.getDeeplinkUrl(t, service) - context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + DeeplinkNavigator.openSearch(context, t, service) } } )