Skip to main content

Deep Linking

Navigate users directly to specific content — a video, playlist, search results, or sub-channel.

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.

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

URLNavigation State
myapp://channelpageType: "main"
myapp://channel/video/12345pageType: "detailPage", contentId: "12345"
myapp://channel/playlist/678pageType: "overviewPage", contentId: "678"
myapp://channel/search/highlightspageType: "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>