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