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