diff --git a/app/src/main/java/org/oxycblt/auxio/AuxioService.kt b/app/src/main/java/org/oxycblt/auxio/AuxioService.kt index 0d1eb0bbc..cd1fe2e91 100644 --- a/app/src/main/java/org/oxycblt/auxio/AuxioService.kt +++ b/app/src/main/java/org/oxycblt/auxio/AuxioService.kt @@ -23,6 +23,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.IBinder +import android.support.v4.media.MediaBrowserCompat import android.support.v4.media.MediaBrowserCompat.MediaItem import androidx.annotation.StringRes import androidx.core.app.NotificationChannelCompat @@ -32,6 +33,7 @@ import androidx.core.app.ServiceCompat import androidx.media.MediaBrowserServiceCompat import androidx.media.utils.MediaConstants import dagger.hilt.android.AndroidEntryPoint +import org.oxycblt.auxio.music.service.MusicBrowser import javax.inject.Inject import org.oxycblt.auxio.music.service.MusicServiceFragment import org.oxycblt.auxio.playback.service.PlaybackServiceFragment @@ -96,14 +98,32 @@ class AuxioService : } override fun onLoadChildren(parentId: String, result: Result>) { - val maximumRootChildLimit = - browserRootHints?.getInt(MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT, 4) - ?: 4 - musicFragment.getChildren(parentId, maximumRootChildLimit, result) + val maximumRootChildLimit = getRootChildrenLimit() + musicFragment.getChildren(parentId, maximumRootChildLimit, result, null) + } + + override fun onLoadChildren( + parentId: String, + result: Result>, + options: Bundle + ) { + val maximumRootChildLimit = getRootChildrenLimit() + musicFragment.getChildren(parentId, maximumRootChildLimit, result, options.getPage()) } override fun onSearch(query: String, extras: Bundle?, result: Result>) { - musicFragment.search(query, result) + musicFragment.search(query, result, extras?.getPage()) + } + + private fun getRootChildrenLimit(): Int { + return browserRootHints?.getInt(MediaConstants.BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT, 4) + ?: 4 + } + + private fun Bundle.getPage(): MusicServiceFragment.Page? { + val page = getInt(MediaBrowserCompat.EXTRA_PAGE, -1).takeIf { it >= 0 } ?: return null + val pageSize = getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1).takeIf { it > 0 } ?: return null + return MusicServiceFragment.Page(page, pageSize) } override fun updateForeground(change: ForegroundListener.Change) { diff --git a/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt b/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt index a076e3c7a..5f597d50c 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/service/MusicServiceFragment.kt @@ -49,6 +49,8 @@ constructor( private val dispatchJob = Job() private val dispatchScope = CoroutineScope(dispatchJob + Dispatchers.Default) + data class Page(val num: Int, val size: Int) + class Factory @Inject constructor( @@ -108,11 +110,12 @@ constructor( ) } - fun getChildren(mediaId: String, maxTabs: Int, result: Result>) = - result.dispatch { musicBrowser.getChildren(mediaId, maxTabs)?.toMutableList() } + fun getChildren(mediaId: String, maxTabs: Int, result: Result>, page: Page?) = + result.dispatch { musicBrowser.getChildren(mediaId, maxTabs)?.expose(page) } - fun search(query: String, result: Result>) = - result.dispatchAsync { musicBrowser.search(query) } + + fun search(query: String, result: Result>, page: Page?) = + result.dispatchAsync { musicBrowser.search(query).expose(page) } private fun Result.dispatch(body: () -> T?) { try { @@ -142,4 +145,15 @@ constructor( } } } + + private fun List.expose(page: Page?): MutableList { + if (page == null) return toMutableList() + val start = page.num * page.size + val end = start + page.size + return if (start >= size) { + mutableListOf() + } else { + subList(start, end.coerceAtMost(size)).toMutableList() + } + } }