Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

All notable changes to this project will be documented in this file.

## [1.2.7]
### Upgrade
- Updates Core SDK version to 1.3.1

## [1.2.6]
### Upgrade
- Updates Core SDK version to 1.3.0
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/io/fastpix/exo/VideoAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import io.fastpix.media3.databinding.VideoRowBinding

class VideoAdapter() :
class VideoAdapter :
RecyclerView.Adapter<VideoAdapter.VideoViewHolder>() {
private var videos: List<DummyData>? = null
var onVideoClick: ((DummyData?) -> Unit)? = null
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/io/fastpix/exo/VideoPlayerActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -502,8 +502,8 @@ class VideoPlayerActivity : AppCompatActivity() {
*/
private fun isNetworkRelatedError(error: PlaybackException): Boolean {
// Check for common network-related error types
val errorMessage = error.message?.lowercase() ?: ""
val causeMessage = error.cause?.message?.lowercase() ?: ""
val errorMessage = error.message?.lowercase().orEmpty()
val causeMessage = error.cause?.message?.lowercase().orEmpty()

val networkKeywords = listOf(
"network", "connection", "timeout", "unreachable",
Expand Down
11 changes: 6 additions & 5 deletions app/src/main/java/io/fastpix/reel/ReelActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import io.fastpix.data.exo.FastPixBaseMedia3Player
import io.fastpix.media3.databinding.ActivityReelBinding
import io.fastpix.media3.databinding.ItemVideoBinding
import io.fastpix.reelapp.VideoItem
import java.util.UUID
import java.util.Locale
import java.util.concurrent.TimeUnit

@OptIn(UnstableApi::class)
Expand Down Expand Up @@ -195,10 +195,10 @@ class ReelActivity : AppCompatActivity() {
super.onScrollStateChanged(recyclerView, newState)
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// Scrolling stopped - find the current visible item
val layoutManager = recyclerView.layoutManager as? LinearLayoutManager
val lm = recyclerView.layoutManager as? LinearLayoutManager
val firstVisiblePosition =
layoutManager?.findFirstCompletelyVisibleItemPosition()
?: layoutManager?.findFirstVisibleItemPosition() ?: -1
lm?.findFirstCompletelyVisibleItemPosition()
?: lm?.findFirstVisibleItemPosition() ?: -1

if (firstVisiblePosition >= 0 && firstVisiblePosition != currentPosition) {
// Switch to new video
Expand Down Expand Up @@ -467,11 +467,12 @@ class ReelActivity : AppCompatActivity() {
val durationSeconds = TimeUnit.MILLISECONDS.toSeconds(duration) % 60

binding.timeDisplay.text = String.format(
Locale.getDefault(),
"%02d:%02d / %02d:%02d",
currentMinutes,
currentSeconds,
durationMinutes,
durationSeconds
durationSeconds,
)
}

Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[versions]
agp = "8.9.1"
core = "1.3.0"
core = "1.3.1"
gson = "2.11.0"
kotlin = "2.2.10"
coreKtx = "1.17.0"
Expand Down
57 changes: 27 additions & 30 deletions media3/src/main/java/io/fastpix/data/exo/FastPixBaseMedia3Player.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.Timeline
import androidx.media3.common.TrackGroup
import androidx.media3.common.Tracks
import androidx.media3.common.VideoSize
import androidx.media3.common.util.UnstableApi
Expand All @@ -18,7 +19,6 @@ import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.analytics.AnalyticsListener
import androidx.media3.exoplayer.source.LoadEventInfo
import androidx.media3.exoplayer.source.MediaLoadData
import androidx.media3.exoplayer.source.TrackGroupArray
import io.fastpix.data.FastPixAnalytics
import io.fastpix.data.FastPixDataSDK
import io.fastpix.data.domain.SDKConfiguration
Expand Down Expand Up @@ -424,10 +424,9 @@ class FastPixBaseMedia3Player(
override fun onTracksChanged(tracks: Tracks) {
super.onTracksChanged(tracks)
try {
val trackGroups =
TrackGroupArray(*tracks.groups.map { it.mediaTrackGroup }.toTypedArray())
if (trackGroups.length > 0) {
mimeType = trackGroups.get(0).getFormat(0).containerMimeType
val trackGroups = tracks.groups.map { it.mediaTrackGroup }
if (trackGroups.isNotEmpty()) {
mimeType = trackGroups[0].getFormat(0).containerMimeType
}
bandwidthDispatcher.onTracksChanged(trackGroups)
} catch (ex: Exception) {
Expand Down Expand Up @@ -749,7 +748,7 @@ class FastPixBaseMedia3Player(
* BandwidthMetric class for tracking individual chunk downloads
*/
internal open inner class BandwidthMetric {
var availableTracks: TrackGroupArray? = null
var availableTracks: List<TrackGroup>? = null
var loadedSegments: HashMap<Long, ChunkDownloadData> = HashMap()

open fun onLoadError(
Expand Down Expand Up @@ -876,8 +875,7 @@ class FastPixBaseMedia3Player(

if (trackFormat != null && availableTracks != null) {
availableTracks?.let { tracksList ->
for (i in 0 until tracksList.length) {
val tracks = tracksList[i]
for (tracks in tracksList) {
for (trackGroupIndex in 0 until tracks.length) {
val currentFormat = tracks.getFormat(trackGroupIndex)
if (trackFormat.width == currentFormat.width &&
Expand Down Expand Up @@ -1042,31 +1040,30 @@ class FastPixBaseMedia3Player(
}
}

fun onTracksChanged(trackGroups: TrackGroupArray) {
val VIDEO = "video"

fun onTracksChanged(trackGroups: List<TrackGroup>) {
currentBandwidthMetric().availableTracks = trackGroups
if (trackGroups.length > 0) {
for (groupIndex in 0 until trackGroups.length) {
val trackGroup = trackGroups[groupIndex]
if (0 < trackGroup.length) {
var trackFormat = trackGroup.getFormat(0)
if (trackFormat.containerMimeType != null && trackFormat.containerMimeType!!.contains(
"video"
for (trackGroup in trackGroups) {
if (0 < trackGroup.length) {
var trackFormat = trackGroup.getFormat(0)
if (trackFormat.containerMimeType != null && trackFormat.containerMimeType?.contains(
VIDEO
) == true
) {
val renditions: MutableList<ChunkRendition> = ArrayList()
for (i in 0 until trackGroup.length) {
trackFormat = trackGroup.getFormat(i)
val rendition = ChunkRendition(
bitrate = trackFormat.bitrate.toLong(),
width = trackFormat.width,
height = trackFormat.height,
codec = trackFormat.codecs,
fps = trackFormat.frameRate.toInt()
)
) {
val renditions: MutableList<ChunkRendition> = ArrayList()
for (i in 0 until trackGroup.length) {
trackFormat = trackGroup.getFormat(i)
val rendition = ChunkRendition(
bitrate = trackFormat.bitrate.toLong(),
width = trackFormat.width,
height = trackFormat.height,
codec = trackFormat.codecs,
fps = trackFormat.frameRate.toInt()
)
renditions.add(rendition)
}
renditionList = renditions
renditions.add(rendition)
}
renditionList = renditions
}
}
}
Expand Down