Deep Linking
Navigate users directly to specific content — a video, playlist, search results, or sub-channel.
Navigation State
All channel navigation is represented by BBNavigationState:
data class BBNavigationState(
val pageType: String, // "main", "detailPage", "overviewPage", "searchPage"
val contentId: String?, // Clip or playlist ID
val contentType: String?, // "mediaclip" or "mediacliplist"
val searchQuery: String?,
val subChannelId: String?
)
Initial Navigation State
Open the channel at a specific location:
// Open on a video detail page
BBChannelView(
channelUrl = "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState = BBNavigationState(
pageType = "detailPage",
contentId = "12345",
contentType = "mediaclip"
),
viewModel = viewModel,
callbacks = callbacks
)
// Open with search results
BBChannelView(
channelUrl = "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState = BBNavigationState(
pageType = "searchPage",
searchQuery = "highlights"
),
viewModel = viewModel,
callbacks = callbacks
)
Programmatic Navigation
After the channel is loaded, use view model methods:
// Navigate to a specific entity
viewModel.navigateToEntity("mediaclip", "12345")
viewModel.navigateToEntity("mediacliplist", "678")
// Search
viewModel.search("highlights")
// Navigate to a sub-channel
viewModel.navigateToSubChannel("sports")
// Go back or reset
viewModel.goBack()
viewModel.navigateTo("main")
warning
Programmatic navigation only works after the channel is ready. Wait for the onReady callback.
Handling Incoming Deep Links
Use Android's intent handling with Compose navigation:
@Composable
fun ChannelScreen(intent: Intent?) {
val viewModel = remember { BBChannelViewModel() }
var channelReady by remember { mutableStateOf(false) }
// Handle deep link from intent
LaunchedEffect(intent, channelReady) {
val data = intent?.data ?: return@LaunchedEffect
if (!channelReady) return@LaunchedEffect
val path = data.pathSegments
when (path.firstOrNull()) {
"video" -> path.getOrNull(1)?.let {
viewModel.navigateToEntity("mediaclip", it)
}
"playlist" -> path.getOrNull(1)?.let {
viewModel.navigateToEntity("mediacliplist", it)
}
"search" -> path.getOrNull(1)?.let {
viewModel.search(it)
}
}
}
BBChannelView(
channelUrl = "https://demo.bbvms.com/ch/channel_name.json",
viewModel = viewModel,
callbacks = BBChannelCallbacks(
onReady = { channelReady = true }
)
)
}
URL Scheme Examples
| URL | Navigation State |
|---|---|
myapp://channel | pageType: "main" |
myapp://channel/video/12345 | pageType: "detailPage", contentId: "12345" |
myapp://channel/playlist/678 | pageType: "overviewPage", contentId: "678" |
myapp://channel/search/highlights | pageType: "searchPage", searchQuery: "highlights" |
Configure these in your AndroidManifest.xml as intent filters:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myapp" android:host="channel" />
</intent-filter>