跳转至

apps\player\src\main\java\cn\nfarms\player\PlayerApp.kt

源码路径:apps\player\src\main\java\cn\nfarms\player\PlayerApp.kt · 61 行

package cn.nfarms.player

import android.app.Application
import android.content.ComponentName
import android.content.Context
import androidx.media3.common.Player
import androidx.media3.session.MediaController
import androidx.media3.session.SessionToken
import cn.nfarms.core.secure.Secrets
import cn.nfarms.core.secure.SoftwareSecrets
import cn.nfarms.core.store.AppFiles
import cn.nfarms.player.data.DemoAudio
import cn.nfarms.player.data.LibraryRepo
import cn.nfarms.player.data.Track
import cn.nfarms.player.play.PlaybackService
import com.google.common.util.concurrent.MoreExecutors
import java.io.File

class PlayerApp : Application() {
    lateinit var container: Container
        private set

    override fun onCreate() {
        super.onCreate()
        container = Container(this)
    }
}

class Container(private val context: Context) {
    val files by lazy { AppFiles.of(context, "player") }
    val secrets: Secrets by lazy { SoftwareSecrets(context.packageName) }
    val repo by lazy { LibraryRepo(files) }
    val tempDir: File by lazy { files.cacheDir("decrypted") }

    /** 首次启动造两首演示曲 + 歌词,保证「一打开就有东西可放」。 */
    fun ensureDemoLibrary(): List<Track> {
        val dir = repo.audioDir()
        val made = mutableListOf<Track>()
        for ((i, name) in listOf("晨雾", "夜航").withIndex()) {
            val wav = DemoAudio.makeWav(dir, name, seconds = 45, seed = i + 1)
            DemoAudio.makeLrc(dir, name, seconds = 45)
            made += repo.addFile(wav, name)
        }
        return made
    }

    /** 连上播放服务。 */
    fun connectPlayer(onReady: (MediaController) -> Unit) {
        val token = SessionToken(context, ComponentName(context, PlaybackService::class.java))
        val future = MediaController.Builder(context, token).buildAsync()
        future.addListener({
            runCatching { onReady(future.get()) }
        }, MoreExecutors.directExecutor())
    }

    fun playerSeed(): List<Track> = repo.snapshot().tracks

    @Suppress("unused")
    private fun unusedListener(p: Player) = p
}