Skip to content

Commit c413e5d

Browse files
committed
Adding PreloadManager doc snippets
Adding snippets to support new PreloadManager docs. That requires bumping the Media3 version up to 1.8.0.
1 parent 7db6576 commit c413e5d

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ wearComposeMaterial3 = "1.5.0-beta04"
7979
wearOngoing = "1.0.0"
8080
wearToolingPreview = "1.0.0"
8181
webkit = "1.14.0"
82+
media3CommonKtx = "1.7.1"
83+
media3Exoplayer = "1.7.1"
8284

8385
[libraries]
8486
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
190192
validator-push = { module = "com.google.android.wearable.watchface.validator:validator-push", version.ref = "validatorPush" }
191193
wear-compose-material = { module = "androidx.wear.compose:compose-material", version.ref = "wearComposeMaterial" }
192194
wear-compose-material3 = { module = "androidx.wear.compose:compose-material3", version.ref = "wearComposeMaterial3" }
195+
androidx-media3-common-ktx = { group = "androidx.media3", name = "media3-common-ktx", version.ref = "media3CommonKtx" }
196+
media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3Exoplayer" }
193197

194198
[plugins]
195199
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }

misc/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ android {
4646

4747
}
4848
dependencies {
49+
implementation(libs.androidx.media3.common.ktx)
50+
implementation(libs.media3.exoplayer)
4951
val composeBom = platform(libs.androidx.compose.bom)
5052
implementation(composeBom)
5153
androidTestImplementation(composeBom)
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.example.snippets
2+
3+
import androidx.media3.common.C
4+
import androidx.media3.exoplayer.source.preload.TargetPreloadStatusControl
5+
import android.os.Bundle
6+
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.media3.common.MediaItem
8+
import androidx.media3.exoplayer.ExoPlayer
9+
import androidx.media3.exoplayer.source.preload.DefaultPreloadManager
10+
import java.lang.Math.abs
11+
12+
13+
// constants to make the code snippets work
14+
const val currentPlayingIndex = 10
15+
16+
// [START android_defaultpreloadmanager_MyTargetPreloadStatusControl]
17+
class MyTargetPreloadStatusControl(
18+
currentPlayingIndex: Int = C.INDEX_UNSET
19+
) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {
20+
21+
override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus? {
22+
if (index - currentPlayingIndex == 1) { // next track
23+
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
24+
// suggest loading 3000ms from the default start position
25+
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
26+
} else if (index - currentPlayingIndex == -1) { // previous track
27+
// return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
28+
// suggest loading 3000ms from the default start position
29+
return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
30+
} else if (abs(index - currentPlayingIndex) == 2) {
31+
// return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
32+
return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
33+
} else if (abs(index - currentPlayingIndex) <= 4) {
34+
// return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
35+
return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
36+
}
37+
return null
38+
}
39+
}
40+
// [END android_defaultpreloadmanager_MyTargetPreloadStatusControl]
41+
42+
public class PreloadManagerSnippetsKotlin {
43+
44+
class PreloadSnippetsActivity : AppCompatActivity() {
45+
private val context = this
46+
47+
override fun onCreate(savedInstanceState: Bundle?) {
48+
super.onCreate(savedInstanceState)
49+
50+
// [START android_defaultpreloadmanager_createPLM]
51+
val targetPreloadStatusControl = MyTargetPreloadStatusControl()
52+
val preloadManagerBuilder =
53+
DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
54+
val preloadManager = preloadManagerBuilder.build()
55+
// [END android_defaultpreloadmanager_createPLM]
56+
57+
val player = preloadManagerBuilder.buildExoPlayer()
58+
59+
// [START android_defaultpreloadmanager_addMedia]
60+
val initialMediaItems = pullMediaItemsFromService(/* count= */ 20);
61+
for (index in 0 until initialMediaItems.size) {
62+
preloadManager.add(initialMediaItems.get(index), /* rankingData= */ index)
63+
}
64+
// items aren't actually loaded yet! need to call invalidate() after this
65+
// [END android_defaultpreloadmanager_addMedia]
66+
67+
// [START android_defaultpreloadmanager_invalidate]
68+
preloadManager.invalidate()
69+
// [END android_defaultpreloadmanager_invalidate]
70+
71+
}
72+
73+
private fun fetchMedia(
74+
preloadManager: DefaultPreloadManager,
75+
mediaItem: MediaItem,
76+
player: ExoPlayer,
77+
currentIndex: Int
78+
) {
79+
// [START android_defaultpreloadmanager_getAndPlayMedia]
80+
// When a media item is about to display on the screen
81+
val mediaSource = preloadManager.getMediaSource(mediaItem)
82+
if (mediaSource != null) {
83+
player.setMediaSource(mediaSource)
84+
}
85+
player.prepare()
86+
87+
// When the media item is displaying at the center of the screen
88+
player.play()
89+
preloadManager.setCurrentPlayingIndex(currentIndex)
90+
91+
// Need to call invalidate() to update the priorities
92+
preloadManager.invalidate()
93+
// [END android_defaultpreloadmanager_getAndPlayMedia]
94+
}
95+
96+
private fun removeMedia(mediaItem: MediaItem, preloadManager: DefaultPreloadManager) {
97+
// [START android_defaultpreloadmanager_removeItem]
98+
preloadManager.remove(mediaItem)
99+
// [END android_defaultpreloadmanager_removeItem]
100+
101+
}
102+
103+
private fun releasePLM(preloadManager: DefaultPreloadManager) {
104+
// [START android_defaultpreloadmanager_releasePLM]
105+
preloadManager.release()
106+
// [END android_defaultpreloadmanager_releasePLM]
107+
}
108+
109+
// dummy methods to support the code snippets
110+
private fun pullMediaItemsFromService(count: Int): List<MediaItem> {
111+
return listOf()
112+
}
113+
}
114+
115+
116+
}

0 commit comments

Comments
 (0)