From 7db6576ef5b9fbb90a3decb2257e4d603dda5f6e Mon Sep 17 00:00:00 2001 From: asolovay Date: Wed, 30 Jul 2025 15:44:28 -0700 Subject: [PATCH 1/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f7e2b547..3e91c571 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -60,7 +60,7 @@ maps-compose = "6.6.0" material = "1.14.0-alpha02" material3-adaptive = "1.1.0" material3-adaptive-navigation-suite = "1.3.2" -media3 = "1.7.1" +media3 = "1.8.0" # @keep minSdk = "35" okHttp = "4.12.0" From c413e5d8353fd69462743b4b89cf7da4ffd312e1 Mon Sep 17 00:00:00 2001 From: asolovay Date: Wed, 30 Jul 2025 15:53:22 -0700 Subject: [PATCH 2/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- gradle/libs.versions.toml | 4 + misc/build.gradle.kts | 2 + .../snippets/PreloadManagerKotlinSnippets.kt | 116 ++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3e91c571..8a807952 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -79,6 +79,8 @@ wearComposeMaterial3 = "1.5.0-beta04" wearOngoing = "1.0.0" wearToolingPreview = "1.0.0" webkit = "1.14.0" +media3CommonKtx = "1.7.1" +media3Exoplayer = "1.7.1" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" @@ -190,6 +192,8 @@ play-services-wearable = { module = "com.google.android.gms:play-services-wearab validator-push = { module = "com.google.android.wearable.watchface.validator:validator-push", version.ref = "validatorPush" } wear-compose-material = { module = "androidx.wear.compose:compose-material", version.ref = "wearComposeMaterial" } wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wearComposeMaterial3" } +androidx-media3-common-ktx = { group = "androidx.media3", name = "media3-common-ktx", version.ref = "media3CommonKtx" } +media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3Exoplayer" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } diff --git a/misc/build.gradle.kts b/misc/build.gradle.kts index af5893d7..4c4e8193 100644 --- a/misc/build.gradle.kts +++ b/misc/build.gradle.kts @@ -46,6 +46,8 @@ android { } dependencies { + implementation(libs.androidx.media3.common.ktx) + implementation(libs.media3.exoplayer) val composeBom = platform(libs.androidx.compose.bom) implementation(composeBom) androidTestImplementation(composeBom) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt new file mode 100644 index 00000000..f3f685ef --- /dev/null +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -0,0 +1,116 @@ +package com.example.snippets + +import androidx.media3.common.C +import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.media3.common.MediaItem +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.source.preload.DefaultPreloadManager +import java.lang.Math.abs + + +// constants to make the code snippets work +const val currentPlayingIndex = 10 + +// [START android_defaultpreloadmanager_MyTargetPreloadStatusControl] +class MyTargetPreloadStatusControl( + currentPlayingIndex: Int = C.INDEX_UNSET +) : TargetPreloadStatusControl { + + override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus? { + if (index - currentPlayingIndex == 1) { // next track + // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and + // suggest loading 3000ms from the default start position + return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) + } else if (index - currentPlayingIndex == -1) { // previous track + // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and + // suggest loading 3000ms from the default start position + return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L) + } else if (abs(index - currentPlayingIndex) == 2) { + // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED + return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED + } else if (abs(index - currentPlayingIndex) <= 4) { + // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED + return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED + } + return null + } +} +// [END android_defaultpreloadmanager_MyTargetPreloadStatusControl] + +public class PreloadManagerSnippetsKotlin { + + class PreloadSnippetsActivity : AppCompatActivity() { + private val context = this + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // [START android_defaultpreloadmanager_createPLM] + val targetPreloadStatusControl = MyTargetPreloadStatusControl() + val preloadManagerBuilder = + DefaultPreloadManager.Builder(context, targetPreloadStatusControl) + val preloadManager = preloadManagerBuilder.build() + // [END android_defaultpreloadmanager_createPLM] + + val player = preloadManagerBuilder.buildExoPlayer() + + // [START android_defaultpreloadmanager_addMedia] + val initialMediaItems = pullMediaItemsFromService(/* count= */ 20); + for (index in 0 until initialMediaItems.size) { + preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index) + } + // items aren't actually loaded yet! need to call invalidate() after this + // [END android_defaultpreloadmanager_addMedia] + + // [START android_defaultpreloadmanager_invalidate] + preloadManager.invalidate() + // [END android_defaultpreloadmanager_invalidate] + + } + + private fun fetchMedia( + preloadManager: DefaultPreloadManager, + mediaItem: MediaItem, + player: ExoPlayer, + currentIndex: Int + ) { + // [START android_defaultpreloadmanager_getAndPlayMedia] + // When a media item is about to display on the screen + val mediaSource = preloadManager.getMediaSource(mediaItem) + if (mediaSource != null) { + player.setMediaSource(mediaSource) + } + player.prepare() + + // When the media item is displaying at the center of the screen + player.play() + preloadManager.setCurrentPlayingIndex(currentIndex) + + // Need to call invalidate() to update the priorities + preloadManager.invalidate() + // [END android_defaultpreloadmanager_getAndPlayMedia] + } + + private fun removeMedia(mediaItem: MediaItem, preloadManager: DefaultPreloadManager) { + // [START android_defaultpreloadmanager_removeItem] + preloadManager.remove(mediaItem) + // [END android_defaultpreloadmanager_removeItem] + + } + + private fun releasePLM(preloadManager: DefaultPreloadManager) { + // [START android_defaultpreloadmanager_releasePLM] + preloadManager.release() + // [END android_defaultpreloadmanager_releasePLM] + } + + // dummy methods to support the code snippets + private fun pullMediaItemsFromService(count: Int): List { + return listOf() + } + } + + +} \ No newline at end of file From 64a7c2ef88f016f6270f56e01f4ca3eac1268abe Mon Sep 17 00:00:00 2001 From: asolovay Date: Wed, 30 Jul 2025 15:57:10 -0700 Subject: [PATCH 3/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a807952..c7bb77ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -79,8 +79,8 @@ wearComposeMaterial3 = "1.5.0-beta04" wearOngoing = "1.0.0" wearToolingPreview = "1.0.0" webkit = "1.14.0" -media3CommonKtx = "1.7.1" -media3Exoplayer = "1.7.1" +media3CommonKtx = "1.8.0" +media3Exoplayer = "1.8.0" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" From 645200f4cc2139e9ea5caf99d12024f03828050c Mon Sep 17 00:00:00 2001 From: asolovay Date: Wed, 30 Jul 2025 15:57:10 -0700 Subject: [PATCH 4/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a807952..c7bb77ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -79,8 +79,8 @@ wearComposeMaterial3 = "1.5.0-beta04" wearOngoing = "1.0.0" wearToolingPreview = "1.0.0" webkit = "1.14.0" -media3CommonKtx = "1.7.1" -media3Exoplayer = "1.7.1" +media3CommonKtx = "1.8.0" +media3Exoplayer = "1.8.0" [libraries] accompanist-adaptive = "com.google.accompanist:accompanist-adaptive:0.37.3" From da757c472f17f61a7aec5d003d09d343283e952f Mon Sep 17 00:00:00 2001 From: asolovay Date: Thu, 31 Jul 2025 14:55:54 -0700 Subject: [PATCH 5/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- .../com/example/snippets/PreloadManagerKotlinSnippets.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt index f3f685ef..827df153 100644 --- a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -3,8 +3,10 @@ package com.example.snippets import androidx.media3.common.C import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl import android.os.Bundle +import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity import androidx.media3.common.MediaItem +import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.source.preload.DefaultPreloadManager import java.lang.Math.abs @@ -13,6 +15,7 @@ import java.lang.Math.abs // constants to make the code snippets work const val currentPlayingIndex = 10 +@UnstableApi // [START android_defaultpreloadmanager_MyTargetPreloadStatusControl] class MyTargetPreloadStatusControl( currentPlayingIndex: Int = C.INDEX_UNSET @@ -44,6 +47,7 @@ public class PreloadManagerSnippetsKotlin { class PreloadSnippetsActivity : AppCompatActivity() { private val context = this + @OptIn(UnstableApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -70,6 +74,7 @@ public class PreloadManagerSnippetsKotlin { } + @OptIn(UnstableApi::class) private fun fetchMedia( preloadManager: DefaultPreloadManager, mediaItem: MediaItem, @@ -93,6 +98,7 @@ public class PreloadManagerSnippetsKotlin { // [END android_defaultpreloadmanager_getAndPlayMedia] } + @OptIn(UnstableApi::class) private fun removeMedia(mediaItem: MediaItem, preloadManager: DefaultPreloadManager) { // [START android_defaultpreloadmanager_removeItem] preloadManager.remove(mediaItem) @@ -100,6 +106,7 @@ public class PreloadManagerSnippetsKotlin { } + @OptIn(UnstableApi::class) private fun releasePLM(preloadManager: DefaultPreloadManager) { // [START android_defaultpreloadmanager_releasePLM] preloadManager.release() @@ -113,4 +120,4 @@ public class PreloadManagerSnippetsKotlin { } -} \ No newline at end of file +} From 9c6040809ffe61dd268489eb7cbea09d0a96f1c7 Mon Sep 17 00:00:00 2001 From: asolovay Date: Thu, 31 Jul 2025 14:57:24 -0700 Subject: [PATCH 6/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- .../java/com/example/snippets/PreloadManagerKotlinSnippets.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt index 827df153..0f81576b 100644 --- a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -42,7 +42,7 @@ class MyTargetPreloadStatusControl( } // [END android_defaultpreloadmanager_MyTargetPreloadStatusControl] -public class PreloadManagerSnippetsKotlin { +class PreloadManagerSnippetsKotlin { class PreloadSnippetsActivity : AppCompatActivity() { private val context = this From 6d26bdaa174ff2fb677727e9a62964b08df069e1 Mon Sep 17 00:00:00 2001 From: asolovay Date: Thu, 31 Jul 2025 14:58:20 -0700 Subject: [PATCH 7/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- .../java/com/example/snippets/PreloadManagerKotlinSnippets.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt index 0f81576b..7a646c0f 100644 --- a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -61,7 +61,7 @@ class PreloadManagerSnippetsKotlin { val player = preloadManagerBuilder.buildExoPlayer() // [START android_defaultpreloadmanager_addMedia] - val initialMediaItems = pullMediaItemsFromService(/* count= */ 20); + val initialMediaItems = pullMediaItemsFromService(/* count= */ 20) for (index in 0 until initialMediaItems.size) { preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index) } From 07439af5fa979539b68982a5191e3b3fa781d55b Mon Sep 17 00:00:00 2001 From: asolovay <149095394+asolovay@users.noreply.github.com> Date: Thu, 31 Jul 2025 22:05:05 +0000 Subject: [PATCH 8/9] Apply Spotless --- .../snippets/PreloadManagerKotlinSnippets.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt index 7a646c0f..4bde20e7 100644 --- a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -1,17 +1,32 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.example.snippets -import androidx.media3.common.C -import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl import android.os.Bundle import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity +import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.source.preload.DefaultPreloadManager +import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl import java.lang.Math.abs - // constants to make the code snippets work const val currentPlayingIndex = 10 @@ -71,7 +86,6 @@ class PreloadManagerSnippetsKotlin { // [START android_defaultpreloadmanager_invalidate] preloadManager.invalidate() // [END android_defaultpreloadmanager_invalidate] - } @OptIn(UnstableApi::class) @@ -103,7 +117,6 @@ class PreloadManagerSnippetsKotlin { // [START android_defaultpreloadmanager_removeItem] preloadManager.remove(mediaItem) // [END android_defaultpreloadmanager_removeItem] - } @OptIn(UnstableApi::class) @@ -118,6 +131,4 @@ class PreloadManagerSnippetsKotlin { return listOf() } } - - } From 306b0d23f7b8fc91d88234247ca0e7217423535a Mon Sep 17 00:00:00 2001 From: asolovay Date: Thu, 31 Jul 2025 15:07:49 -0700 Subject: [PATCH 9/9] Adding PreloadManager doc snippets Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0. --- .../java/com/example/snippets/PreloadManagerKotlinSnippets.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt index 4bde20e7..f8ffe5cc 100644 --- a/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt +++ b/misc/src/main/java/com/example/snippets/PreloadManagerKotlinSnippets.kt @@ -85,7 +85,7 @@ class PreloadManagerSnippetsKotlin { // [START android_defaultpreloadmanager_invalidate] preloadManager.invalidate() - // [END android_defaultpreloadmanager_invalidate] + // [END android_defaultpreloadmanager_invalidate] } @OptIn(UnstableApi::class)