diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f60dd..1a717d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/app/src/main/java/io/fastpix/exo/VideoAdapter.kt b/app/src/main/java/io/fastpix/exo/VideoAdapter.kt index 631a2aa..1ff4e7b 100644 --- a/app/src/main/java/io/fastpix/exo/VideoAdapter.kt +++ b/app/src/main/java/io/fastpix/exo/VideoAdapter.kt @@ -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() { private var videos: List? = null var onVideoClick: ((DummyData?) -> Unit)? = null diff --git a/app/src/main/java/io/fastpix/exo/VideoPlayerActivity.kt b/app/src/main/java/io/fastpix/exo/VideoPlayerActivity.kt index 6515182..cf82dca 100644 --- a/app/src/main/java/io/fastpix/exo/VideoPlayerActivity.kt +++ b/app/src/main/java/io/fastpix/exo/VideoPlayerActivity.kt @@ -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", diff --git a/app/src/main/java/io/fastpix/reel/ReelActivity.kt b/app/src/main/java/io/fastpix/reel/ReelActivity.kt index 0381561..f487ab5 100644 --- a/app/src/main/java/io/fastpix/reel/ReelActivity.kt +++ b/app/src/main/java/io/fastpix/reel/ReelActivity.kt @@ -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) @@ -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 @@ -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, ) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3d0cfb2..6b93ed5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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" diff --git a/media3/src/main/java/io/fastpix/data/exo/FastPixBaseMedia3Player.kt b/media3/src/main/java/io/fastpix/data/exo/FastPixBaseMedia3Player.kt index c5fef39..9af91d4 100644 --- a/media3/src/main/java/io/fastpix/data/exo/FastPixBaseMedia3Player.kt +++ b/media3/src/main/java/io/fastpix/data/exo/FastPixBaseMedia3Player.kt @@ -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 @@ -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 @@ -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) { @@ -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? = null var loadedSegments: HashMap = HashMap() open fun onLoadError( @@ -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 && @@ -1042,31 +1040,30 @@ class FastPixBaseMedia3Player( } } - fun onTracksChanged(trackGroups: TrackGroupArray) { + val VIDEO = "video" + + fun onTracksChanged(trackGroups: List) { 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 = 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 = 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 } } }