Configure Video Feed
Last updated
Was this helpful?
Last updated
Was this helpful?
Was this helpful?
You need to add the FwVideoFeedView
to your layout XML file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- All custom app attributes are optional here -->
<!-- You can remove all of them and let the widget use the default values -->
<!-- Or set them programmatically -->
<!-- Keep in mind if you use the Channel feedType then you must provide ChannelId too -->
<!-- Keep in mind if you use the Playlist feedType then you must provide ChannelId and PlaylistId too -->
<com.firework.videofeed.FwVideoFeedView
android:id="@+id/videoFeedView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:fw_adBadgeBackgroundColor="#FFFECD"
app:fw_adBadgeIsHidden="false"
app:fw_adBadgeLabel="sponsored"
app:fw_adBadgeShowOnThumbnails="true"
app:fw_adBadgeTextColor="#000000"
app:fw_adBadgeTextTypeface="@font/roboto"
app:fw_backColor="@color/white"
app:fw_channelId="Your encoded channel Id"
app:fw_columns="3"
app:fw_feedAutoplay="true"
app:fw_feedLayout="grid"
app:fw_feedResource="discovery"
app:fw_feedTitleBackgroundColor="@color/purple_transparent"
app:fw_feedTitlePosition="nested"
app:fw_feedTitleTextColor="@color/black"
app:fw_feedTitleTextNumberOfLines="1"
app:fw_feedTitleTextPadding="4dp"
app:fw_feedTitleTextSize="12sp"
app:fw_feedTitleTextTypeface="@font/roboto"
app:fw_itemSpacing="4dp"
app:fw_playIconWidth="24dp"
app:fw_playerMode="fit_mode"
app:fw_roundedCorner="true"
app:fw_roundedCornerRadius="16dp"
app:fw_playlistId="Your encoded playlist Id"
app:fw_showFeedTitle="true"
app:fw_showPlayIcon="true"
app:fw_showFireworkLogo="true"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Later on your Activity's onCreate
or your Fragment's onViewCreated
find and initialize the FwVideoFeedView
:
// You can create a view options with your custom parameters or ignore this step if you already have them in your layout
// Also creating ViewOptions is not mandatory and you can let the widget use its default values
val viewOptions = viewOptions {
baseOptions {
feedResource(
FeedResource.Discovery, // It also can be Channel and Playlist
)
}
layoutOptions {
feedLayout(FeedLayout.GRID)
columnCount(3)
backgroundColor(Color.BLACK)
feedTitlePosition(FeedTitlePosition.NESTED) // It also can be STACKED
itemSpacing(4.dp)
playIconWidth(24.dp)
roundedCorner(true)
roundedCornerRadius(16.dp)
showPlayIcon(true)
}
adBadgeOptions {
adBadgeBackColor(Color.BLUE)
adBadgeIsHidden(false)
adBadgeLabel(AdBadgeTextType.SPONSORED)
adBadgeShowOnThumbnails(true)
adBadgeTextColor(Color.WHITE)
adBadgeTypeface(Typeface.SANS_SERIF) // You can use the Typeface of your choice
}
titleOptions {
feedTitleBackgroundColor(Color.TRANSPARENT)
feedTitleBackgroundDrawable(
GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
arrayOf(Color.BLUE, Color.CYAN, Color.MAGENTA).toIntArray()
),
)
feedTitleTextColor(Color.WHITE)
feedTitleTextNumberOfLines(1)
feedTitleTextPadding(4.dp)
feedTitleTextSize(12.dp)
feedTitleTextTypeface(Typeface.SANS_SERIF) // You can use the Typeface of your choice
showFeedTitle(true)
}
playerOptions {
autoplay(true)
playerMode(PlayerMode.FIT_MODE)
showFireworkLogo(true)
shareBaseUrl("https://your-business.com") // shareBaseUrl is an optional parameter.
}
}
val videoFeedView = findViewById<FwVideoFeedView>(R.id.videoFeedView)
// init video feed view with view options
// videoFeedView.init(viewOptions)
// or without view options
videoFeedView.init()
After FwVideoFeedView
is not needed anymore it should be destroyed. Call videoFeedView.destroy()
to clean up all resources related to the instance of FwVideoFeedView
.
If FwVideoFeedView
is used inside a fragment, it should be destroyed in fragment's onDestroyView()
lifecycle callback:
MyFragment: Fragment() {
...
override fun onDestroyView() {
videoFeedView.destroy()
super.onDestroyView()
}
}
If FwVideoFeedView
is used inside an Activity it should be destroyed in activity's onDestroy()
lifecycle callback:
MyActivity: Activity() {
...
override fun onDestroy() {
videoFeedView.destroy()
super.onDestroy()
}
}
Is a wrapper around the FwVideoFeedView
which accepts lifecycle object in its init(
) function. This allows to clean up all the resources related to underlaying FwVideoFeedView
automatically without calling destroy()
function. This is convenient when activity or fragment does not hold the reference to FwVideoFeedView
(ex. when FwVideoFeedView
is used as an item inside RecyclerView
.
class MyActivity: Activity() {
private lateinit var lifecycleAwareViewFeedView: FwLifecycleAwareVideoFeedView
override fun onCreate() {
...
lifecycleAwareViewFeedView.init(viewOptions, lifecycle)
}
override fun onDestroy() {
// No need to destroy lifecycleAwareViewFeedView
super.onDestroy()
}
}
In this table, you can check the different states of the state machine of the Feed type and its parameters.
✅ Means correct value
❌ Means invalid value or empty value
Discovery
✅
✅
Discovery feed
Discovery
✅
❌
Discovery feed
Discovery
❌
✅
Discovery feed
Discovery
❌
❌
Discovery feed
Channel
✅
✅
Channel feed
Channel
✅
❌
Channel feed
Channel
❌
✅
Server returns an empty feed
Channel
❌
❌
Server returns an empty feed
Playlist
✅
✅
Playlist feed
Playlist
❌
✅
Server returns an empty feed
Playlist
✅
❌
Server returns an empty feed
Playlist
❌
❌
Server returns an empty feed
This value determines if the first complete visible item of the feed shows as a video instead of a static thumbnail.
Feed layout is the way that Firework Android SDK shows video feeds to the user.
FeedLayout.HORIZONTAL: Shows video feeds as a horizontal list (default value)
FeedLayout.GRID: Shows video feeds as a grid layout
FeedLayout.VERTICAL: Shows video feeds as a vertical list
Using this parameter you can set the number of columns in a grid layout FeedLayout.GRID
. (default value is 1)
This is the background color of the video feed view. (default value is transparent)
This value determines the space between items in the list. (default value is 8dp)
This value determines whether the video feed view should round the corner of the items in the video feeds or not. (default value is false)
This value specifies the radius of the rounded corner if you set the rounded corner. (default value is 5dp)
This value is being used to show the title of each video item or not. (default value is false)
You can change the font of video titles in feed, this can be the typeface of your choice, by default it uses Typeface.Default
.
This position defines where the video titles are displayed.
FeedTitlePosition.NESTED: Shows the video titles over the bottom part of the video thumbnail.
FeedTitlePosition.STACKED: Shows the video title below the thumbnail.
The color of the video title. (default value is #80000000)
Number of lines of the video feed title. (default value is 2)
Padding of the feed title. (default value is 8dp)
Feed title text size. (default value is 14sp)
This is the background color of the feed title view, this applies to NESTED
and STACKED
feed title positions.
This accepts a GradientDrawable
and it will be shown as the background of feed titles, this applies to NESTED
and STACKED
feed title positions, Note: This background will get priority over Feed title background color
Determines the player mode and can be one of
PlayerMode.FIT_MODE: This state causes the player surface cuts into a smaller area of the screen while it maintains the 9:16 aspect ratio. Also, it makes the corner of the player rounded. (default value)
PlayerMode.FULL_BLEED_MODE: This state causes the player surface to fill the mobile screen without rounding the corner of the screen, Also player maintains the 9:16 aspect ratio of the player.
This value determines whether the video feed view shows a play icon in the center of the feed item or not. (default value is false)
This value determines the width of the play icon shown on top of video feed thumbnails.
These values specify the color of the background of the ad badge on the top right corner of the ad videos. (default value is Transparent)
This value determines wheter the ad label is visible or not in player.
This value determines wheter the ad label is visible or not in FwVideoFeedView
.
You can change the font of ad badge, this can be the typeface of your choice, by default it uses Typeface.Default
.
These values specify the color of the text of the ad badge on the top right corner of the ad videos. (default value is White)
The text is being shown on the ad badge view in the top right corner of the ad videos. It has two static options:
Sponsored (default value)
Ad
This value determines if the firework logo is shown in player.
To track clicks on the feed item use setOnFeedItemClickListener
function of the FwVideoFeedView
class. Only one listener can be set per FwVideoFeedView
instance.
videoFeedView.setOnFeedItemClickListener(object: FeedItemClickListener {
override fun onItemClicked(feedItem: FeedItemClickListener.FeedItem) {
// Handle click here
}
})
}
Check Video Deep Linking section to learn more about custom share base URL.
Share & Video Deep linkingTo receive any errors that may happen in the video feed, use the setOnErrorListener
function of the FwVideoFeedView
class. Only one listener can be set per FwVideoFeedView
instance.
videoFeedView.setOnErrorListener { error ->
// Handle video feed error here
}
The possible error types are:
// Video feed related errors
sealed interface VideoFeedError : FwError {
object LoadingFailed : VideoFeedError
}
// Ad related errors
sealed interface AdsError : FwError {
data class VideoLoadFailed(val videoId: String) : AdsError
data class PlaybackFailed(val message: String) : AdsError
object ImaAdFailed : AdsError
}
// Livestream related errors
sealed interface LivestreamError : FwError {
object MissingLivestreamInitializer : LivestreamError
object EngineFailed : LivestreamError
}
// Share related errors
sealed interface ShareContentError : FwError {
object EmptyShareUrl : ShareContentError
object SharingFailed : ShareContentError
}
Call the videoFeedView.refresh()
function to refresh the content of FwVideoFeedView
.
The setOnFeedViewStateListener()
method in FwVideoFeedView
allows you to monitor and respond to state changes in the video feed. This method provides real-time feedback about the feed's loading status, content availability, and error conditions.
fun setOnFeedViewStateListener(feedViewStateListener: FeedViewStateListener)
feedViewStateListener
(FeedViewStateListener
): A listener interface that receives feed state change notifications
fun interface FeedViewStateListener {
fun onLoadStateChanged(feedViewState: FeedViewState)
}
The FeedViewState
is a sealed interface with the following possible states:
1. Loading
Description: The feed is currently loading content
Usage: Show loading indicators or progress bars
Example:
is FeedViewState.Loading -> {
binding.progressBar.isVisible = true
binding.emptyStateView.isVisible = false
}
2. LoadData
Description: Data has been successfully loaded and is available
Usage: Hide loading indicators, display content
Example:
is FeedViewState.LoadData -> {
binding.progressBar.isVisible = false
binding.swipeRefreshLayout.isRefreshing = false
}
3. EmptyFeed
Description: The feed has no content to display
Usage: Show empty state messages or call-to-action
Example:
is FeedViewState.EmptyFeed -> {
binding.progressBar.isVisible = false
binding.emptyStateView.isVisible = true
binding.emptyStateView.text = "No videos available"
}
4. EndOfFeed
Description: User has reached the end of available content
Usage: Show end-of-feed messages or load more content
Example:
is FeedViewState.EndOfFeed -> {
binding.progressBar.isVisible = false
binding.endOfFeedView.isVisible = true
Toast.makeText(context, "You've reached the end", Toast.LENGTH_SHORT).show()
}
5. Error
Description: An error occurred while loading feed content
Properties: message: String
- Error description
Usage: Display error messages and provide retry options
Example:
is FeedViewState.Error -> {
binding.progressBar.isVisible = false
binding.errorView.isVisible = true
binding.errorView.text = "Error: ${feedViewState.message}"
}
Basic Implementation
binding.videoFeedView.setOnFeedViewStateListener { feedViewState ->
when (feedViewState) {
is FeedViewState.Loading -> {
// Show loading state
binding.progressBar.isVisible = true
binding.emptyStateView.isVisible = false
binding.errorView.isVisible = false
}
is FeedViewState.LoadData -> {
// Hide loading, show content
binding.progressBar.isVisible = false
binding.swipeRefreshLayout.isRefreshing = false
}
is FeedViewState.EmptyFeed -> {
// Show empty state
binding.progressBar.isVisible = false
binding.emptyStateView.isVisible = true
binding.emptyStateView.text = "No videos available"
}
is FeedViewState.EndOfFeed -> {
// Show end of feed
binding.progressBar.isVisible = false
binding.swipeRefreshLayout.isRefreshing = false
Toast.makeText(context, "End of feed reached", Toast.LENGTH_SHORT).show()
}
is FeedViewState.Error -> {
// Show error state
binding.progressBar.isVisible = false
binding.errorView.isVisible = true
binding.errorView.text = "Error: ${feedViewState.message}"
}
}
}