Cache if playback is in radio mode to be able to continue after app gets killed.
This commit is contained in:
parent
ae903aba65
commit
d5c1b89d3d
|
@ -2,6 +2,8 @@ package com.github.apognu.otter.playback
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.github.apognu.otter.R
|
import com.github.apognu.otter.R
|
||||||
|
import com.github.apognu.otter.repositories.FavoritedRepository
|
||||||
|
import com.github.apognu.otter.repositories.Repository
|
||||||
import com.github.apognu.otter.utils.*
|
import com.github.apognu.otter.utils.*
|
||||||
import com.github.kittinunf.fuel.Fuel
|
import com.github.kittinunf.fuel.Fuel
|
||||||
import com.github.kittinunf.fuel.coroutines.awaitObjectResult
|
import com.github.kittinunf.fuel.coroutines.awaitObjectResult
|
||||||
|
@ -10,6 +12,8 @@ import com.google.gson.Gson
|
||||||
import kotlinx.coroutines.Dispatchers.IO
|
import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.Dispatchers.Main
|
import kotlinx.coroutines.Dispatchers.Main
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.toList
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.sync.Semaphore
|
import kotlinx.coroutines.sync.Semaphore
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
@ -26,6 +30,17 @@ class RadioPlayer(val context: Context) {
|
||||||
private var currentRadio: Radio? = null
|
private var currentRadio: Radio? = null
|
||||||
private var session: Int? = null
|
private var session: Int? = null
|
||||||
|
|
||||||
|
private val favoritedRepository = FavoritedRepository(context)
|
||||||
|
|
||||||
|
init {
|
||||||
|
Cache.get(context, "radio_id")?.readLine()?.toInt()?.let { radio_id ->
|
||||||
|
Cache.get(context, "radio_session")?.readLine()?.toInt()?.let { radio_session ->
|
||||||
|
currentRadio = Radio(radio_id, "", "")
|
||||||
|
session = radio_session
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun play(radio: Radio) {
|
fun play(radio: Radio) {
|
||||||
currentRadio = radio
|
currentRadio = radio
|
||||||
session = null
|
session = null
|
||||||
|
@ -38,6 +53,9 @@ class RadioPlayer(val context: Context) {
|
||||||
fun stop() {
|
fun stop() {
|
||||||
currentRadio = null
|
currentRadio = null
|
||||||
session = null
|
session = null
|
||||||
|
|
||||||
|
Cache.delete(context, "radio_id")
|
||||||
|
Cache.delete(context, "radio_session")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isActive() = currentRadio != null && session != null
|
fun isActive() = currentRadio != null && session != null
|
||||||
|
@ -54,6 +72,9 @@ class RadioPlayer(val context: Context) {
|
||||||
|
|
||||||
session = result.get().id
|
session = result.get().id
|
||||||
|
|
||||||
|
Cache.set(context, "radio_id", radio.id.toString().toByteArray())
|
||||||
|
Cache.set(context, "radio_session", session.toString().toByteArray())
|
||||||
|
|
||||||
prepareNextTrack(true)
|
prepareNextTrack(true)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
withContext(Main) {
|
withContext(Main) {
|
||||||
|
@ -73,14 +94,23 @@ class RadioPlayer(val context: Context) {
|
||||||
.body(body)
|
.body(body)
|
||||||
.awaitObjectResult(gsonDeserializerOf(RadioTrack::class.java))
|
.awaitObjectResult(gsonDeserializerOf(RadioTrack::class.java))
|
||||||
|
|
||||||
val track = Fuel.get(mustNormalizeUrl("/api/v1/tracks/${result.get().track.id}/"))
|
val trackResponse = Fuel.get(mustNormalizeUrl("/api/v1/tracks/${result.get().track.id}/"))
|
||||||
.authorize()
|
.authorize()
|
||||||
.awaitObjectResult(gsonDeserializerOf(Track::class.java))
|
.awaitObjectResult(gsonDeserializerOf(Track::class.java))
|
||||||
|
|
||||||
|
val favorites = FavoritedRepository(context).fetch(Repository.Origin.Network.origin)
|
||||||
|
.map { it.data }
|
||||||
|
.toList()
|
||||||
|
.flatten()
|
||||||
|
|
||||||
|
val track = trackResponse.get().apply {
|
||||||
|
favorite = favorites.contains(id)
|
||||||
|
}
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
CommandBus.send(Command.ReplaceQueue(listOf(track.get()), true))
|
CommandBus.send(Command.ReplaceQueue(listOf(track), true))
|
||||||
} else {
|
} else {
|
||||||
CommandBus.send(Command.AddToQueue(listOf(track.get())))
|
CommandBus.send(Command.AddToQueue(listOf(track)))
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
withContext(Main) {
|
withContext(Main) {
|
||||||
|
|
|
@ -89,4 +89,10 @@ object Cache {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun delete(context: Context?, key: String) = context?.let {
|
||||||
|
with(File(it.cacheDir, key(key))) {
|
||||||
|
delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue